Python 3使用带有变音符号和连字号的正则表达式

7

表单中的名称:Ceasar,Julius将被拆分为First_name Julius Surname Ceasar。

名称可能包含变音符(á à é..)和连字号(æ,ø)

这段代码在Python 3.3中似乎运行良好。

import re

def doesmatch(pat, str):  
    try: 
        yup = re.search(pat, str)
        print('Firstname {0} lastname {1}'.format(yup.group(2), yup.group(1)))
    except AttributeError:
        print('no match for {0}'.format(str))

s = 'Révèrberë, Harry'
t = 'Åapö, Renée'
u = 'C3po, Robby'
v = 'Mærsk, Efraïm'
w = 'MacDønald, Ron'
x = 'Sträßle, Mpopo'

pat = r'^([^\d\s]+), ([^\d\s]+)'
# matches any letter, diacritic or ligature, but not digits or punctuation inside the () 

for i in s, t, u, v, w, x:
    doesmatch(pat, i)

除了数字不匹配外,其他都匹配(即名称中没有数字),但我想知道是否有比非数字非空格的方法更好。 更重要的是:我想改进模式,使其区分大小写字母,但是包括大写变音符号和连字号,最好也使用正则表达式。 就像([A-Z] [a-z] +)一样,可以匹配带变音符号和组合字符的字母。
这可行吗?
(到目前为止我所看过的内容: Dive into python 3 on UTF-8 vs Unicode ; 这个Unicode正则表达式教程(我没有使用它); 我认为我不需要new regex,但我承认我没有阅读所有的文档)

为什么不使用 pat = r'^([^,]+), (.*)$' - Cristian Ciupitu
@Cristian:这样会不会也匹配上“G@rd$tr%m,Joe”?在需要解析花哨的Twitter用户名之前,我宁愿不这样做。但是,谢谢! - RolfBly
1个回答

4

如果您想使用标准库的re模块区分大小写字母,那么恐怕您需要手动构建一个包含所有相关Unicode代码点的字符类。

如果您不是真正需要这样做,请使用

[^\W\d_]

匹配任何Unicode字母。这个字符类匹配“非非字母数字字符”(也就是“字母数字字符”)但不是数字和下划线的任何内容。


非常感谢。我一直在想[^\W]否定的速记类。在Jan Goyvaerts的正则表达式[参考][ref]中,它说“可以在类内部使用,但这很令人困惑”。我认为这并不比正则表达式本身更令人困惑。[ref][http://www.regular-expressions.info/reference.html] - RolfBly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接