我有一个包含大量数据的文本文件,包括街道地址。 我试图通过制作正则表达式来提取地址。
地址的格式如下: “34rueRoveré” 要么 “432下坡路”
所以总是1到3位数字,后跟1个空格,然后是1到N个单词,用空格分隔。没有标点符号。请注意,单词可以包含带重音的字母。例如:éè等。这就是为什么我把unicode代码放在我的正则表达式中。
到目前为止,我的正则表达式看起来像这样: [0-9] {1,2} \ S([A-ZA-Z \ u00C0- \ u017F] + \ S *)+
但我最终得到的文本数据行如下所示: “34 44 55 rue du therne,04 84 98” 我希望正则表达式只匹配:“55 rue du therne”
但是我当前的表达式也匹配地址周围的文本。 我在http://rubular.com/尝试了一些事情,但似乎无法正确地完成它以做我需要的事情。
任何帮助将不胜感激。我对正则表达没有经验,抱歉。
答案 0 :(得分:7)
re
模块由于Python不支持简单的语法来匹配Unicode Letter类别中的任何字符,因此我们必须通过列出包含我们想要允许的字符的范围来解决此问题。
\b\d{1,3}(?:\s[a-zA-Z\u00C0-\u017F]+)+
样品运行:
>>> re.search(r'\b\d{1,3}(?:\s[a-zA-Z\u00C0-\u017F]+)+', s).group(0)
'55 rue du therne'
>>> re.search(r'\b\d{1,3}(?:\s[a-zA-Z\u00C0-\u017F]+)+', "xxx 35 rue Hote de ma maison, 060 06 ").group(0)
'35 rue Hote de ma maison'
>>> re.search(r'\b\d{1,3}(?:\s[a-zA-Z\u00C0-\u017F]+)+', "xxx 34 rue Roveré").group(0)
'34 rue Roveré'
regex
module 但是,上述解决方案无法扩展到不同语言的字符。如果您不介意安装外部regex
模块,则可以使用\p{L}
匹配任何语言的任何字母。
\b[0-9]{1,3}(?:\s\p{L}+)+
[0-9]{1,3}
匹配一个或两个或三位数字。 \s\p{L}+
匹配空格和一个或多个字母。同样,非捕获组之后的(?:\s\p{L}+)+
+
将在非捕获组内重复一次或多次模式。
要使用此功能,您需要导入regex
模块而不是re
模块。
>>> reg = regex.compile(r'\b[0-9]{1,3}(?:\s\p{L}+)+')
>>> reg.search("xxx 35 rue Hote de ma maison, 060 06 ").group(0)
'35 rue Hote de ma maison'
>>> reg.search('"xxx 34 rue Roveré').group(0)
'34 rue Roveré'