有没有更好的方法来解决Python中的这个正则表达式?

时间:2015-05-26 11:05:12

标签: python regex

我的Python列表如下,

l = ['ac no **82....383 is as on 6767', 'ac **82....383 in for 23-23']

我编写了Python正则表达式来提取列表上面元素中'383'位置的任何数字:

for i in l:
    match = re.search(r'ac.*\.([\d]*)\s(is|in)', i)
    if match: print match.group(1)

工作正常。 但它不适用于此。

l = ['ac no **82....383 of as on 2737183']

我可以通过调整相同的正则表达式来解决这个问题。但如果有更好的方法,我真的很感激。

3 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

ac.*?\.([\d]*)\b
    ^         ^
  • ?让它变得非贪婪
  • \b使其独立于is, of, in etc..

请参阅DEMO

即:

match = re.search(r'ac.*?\.([\d]*)\b', i)

答案 1 :(得分:0)

这是因为你的号码后面有of这个词而你没有在正则表达式中定义这种情况(你刚刚定义了isin)。您也可以在群组of中添加(is|in),或者作为一般方式使用其他正则表达式。

例如,您可以使用r'\.{3,}(\d*)作为匹配前面有3个或更多点的数字的正则表达式。

>>> l = ['ac no **82....383 is as on 6767', 'ac **82....38300 in for 23-23','ac no **82....323 of as on 2737183']
>>> for i in l:
...     match = re.search(r'ac.*\.{3,}(\d*)', i)
...     if match: print match.group(1)
... 
383
38300
323

答案 2 :(得分:0)

或者你可以在没有正则表达式的情况下完成它,例如:

a = 'ac no **82....383 of as on 2737183'

print a.split(".")[-1].split(" ")[0]

==> 383