使用re模块进行地址匹配的正则表达式

时间:2015-02-12 11:45:00

标签: python regex

我需要匹配表单的地址:1-3个数字,然后是空格,然后是用空格分隔的几个单词(字母)。

这些字词可以包含重音符(éèê等),这些字词可以包含破折号(-

示例:

xxyz 01 02 03 04 123 allée pont-du-nord de la foret, 01 02 03 

只需匹配:

123 allée pont-du-nord de la forêt

我目前使用Python re模块的正则表达式:

\b\d{1,3}(?:\s[a-zA-Z\u00C0-\u017F]+)+'

这适用于地址,但它也匹配电话号码(我不想这样),如:

01 02 03 04 05 06

我需要正则表达式强制执行以下事实:字符串有一个数字,后跟一个空格,后跟一个或多个单词(可以包含短划线-),单词用空格分隔。< / p>

2 个答案:

答案 0 :(得分:0)

您可以尝试下面的内容,

>>> s = 'xxyz 01 02 03 04 123 allée pont-du-nord de la foret, 01 02 03'
>>> re.search(r'(?!\b\d+\s+\d+)\b\d{1,3}(?:\s[a-zA-Z\u00C0-\u017F-]+)+', s).group()
'123 allée pont-du-nord de la foret'

我刚刚对原始正则表达式做了两处修改。

  • (?!\b\d+\s+\d+)这个开头的负面预测断言,在开始时没有一个或多个数字字符后跟一个空格和一个数字。这使我们的正则表达式不匹配09 89

  • 之类的字符串
  • \u00C0-\u017F-通过在字符类中添加连字符,字符类中的模式不仅匹配字母或数字,还匹配连字符。

>>> re.search(r'\b\d{1,3}(?:(?!\d)\s[a-zA-Z\u00C0-\u017F-]+)+', s).group()
'123 allée pont-du-nord de la foret'

答案 1 :(得分:0)

此正则表达式在您的测试字符串中找到您想要的匹配项:

\b\d{1,3}\s[a-zA-Zéèê -]+\b

连字符必须位于字符类的末尾,才能算作范围运算符。

编辑哦Python 2 ...你走了:

r=re.compile(r"\b\d{1,3}\s(\w|[' -])+\b", re.UNICODE)