Python中的正则表达式。任何人都可以帮助新手吗?

时间:2012-03-30 18:08:17

标签: python regex

这个简单的问题正在困扰着我。我之前发布了一些关于尝试清理地址数据库的内容,有人建议GeoPy检查地址的有效性。我不知道的好工具,但在此之前,我需要稍微清理一下数据库,因为geopy不会处理凌乱的格式化。 解决方案是使用正则表达式,我认为我已经修复了我在数据库中看到的大多数地址类型。 然而,我遇到了我定义的最后一个RegExp(在代码中称为r4)的问题,因为它重新调整了我不需要的第一个括号的一部分,我不知道为什么我有一个额外的空格。它返回最后一组(城市:伦敦,国家:英格兰)。 有人可以帮忙吗?

import re

r1 = '\s*ForeignZip.*--\s*([\d\.]+)'
r2 = '(\w+)\W*,\W*(\w*)'
r3 = '(?<=\().*?(?=\))'
r4 = '(\w+\W\()'

Location = ['   ForeignZip (xxx) -- 734.450','Washington, DC.','London (England)']

for item in Location:
    print item
    match1 = re.search(r1,item)
    match2 = re.search(r2,item)
    match3 = re.search(r3,item)
    match4 = re.search(r4,item)

    if match1:
        print 'pattern 1 found:', match1.group(1)

    elif match2:
        print 'pattern 2 found: City :' + match2.group(1) + ", State :" + match2.group(2)

    elif match3:
        print 'pattern 3 found: City: ', match4.group() + ", Country :" + match3.group(0)

    else:
        print 'no match'

返回

   ForeignZip (xxx) -- 734.450
pattern 1 found: 734.50
Washington, DC.
pattern 2 found: City :Washington, State :DC
London (England)
pattern 3 found: City:    London (, Country :England

5 个答案:

答案 0 :(得分:2)

将r4更改为以下

r4 = '\w+\W'

同样在,

elif match3:
        print 'pattern 3 found: City: ', match4.group() + ", Country :" + match3.group(0)

你在城市之后放了一个“,”而不是放置空格的“+”。将其更改为以下内容。

elif match3:
        print 'pattern 3 found: City: ' + match4.group() + ", Country :" + match3.group(0)

答案 1 :(得分:2)

稍微改变你后来的正则表达式是必要的...有可能有一百万种方法可以做到这一点,但这里有一个。:

r3 = r'(\w+)\s+\((\w+)\)'   #Match a word (group1), whitespace followed by a '(' then another word (group2) and finally a closing ')'

或者让空白完全无关紧要:

r3 = r'(\s*(?:\w+\s*)*)\s*\(\s*((?:\w+\s*)+)\s*\)'

它基本上是以前的正则表达式,除了它用\w+替换(?:\w+\s*)*,它允许匹配多个单词但不捕获它们 - 它使“组”与{{{{ 1}}永远不会保存匹配在任何地方的字符串。

现在将第三个测试更改为:

(?:...)

我也删除了r4,因为它已经不再需要了......(同时将','更改为'+'以保持一致性并在'City:'中添加空格)

另请注意,在处理正则表达式时,使用“原始”字符串通常很好(这可以防止python在字符串中破坏令牌。要测试差异,请尝试:

elif match3:
    print 'pattern 3 found: City : '+ match3.group(1) + ", Country :" + match3.group(2)

答案 2 :(得分:1)

让我们来看看:

(\w+\W\()

首先,您将最外面的parens的引用保存到其中匹配的任何内容中,因此:

\w+\W\(

...注意\( - 与文字打开的paren相匹配

另外,我不是一个Python人,但这里的逗号是偶然的加号吗?

City: ', match4.group() + ...

答案 3 :(得分:1)

它返回括号,因为它是模式的一部分:\(

你可以这样做:

r4 = '(\w+\W)\('
[...]
print 'pattern 3 found: City: ', match4.group(1)

答案 4 :(得分:1)

    如果你处于循环中,
  1. re.compile会加快速度。
  2. 大型正则表达式非常高效
  3. 小组字典可以告诉你在哪里找到了什么
  4. finder = re.compile('\s*ForeignZip.*--\s*(?P<fzip>[\d\.]+)|(?P<uscity>\w+)\W*,\W*(?P<state>\w*)|(?P<fcity>\w+)\W*\((?P<country>\w*)\)')
    [finder.match(l).groupdict() for l in ll]
    

    返回:

    [{'country': None,
      'fcity': None,
      'fzip': '734.450',
      'state': None,
      'uscity': None},
     {'country': None,
      'fcity': None,
      'fzip': None,
      'state': 'DC',
      'uscity': 'Washington'},
     {'country': 'England',
      'fcity': 'London',
      'fzip': None,
      'state': None,
      'uscity': None}]