这个简单的问题正在困扰着我。我之前发布了一些关于尝试清理地址数据库的内容,有人建议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
答案 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)
#
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}]