Python中匹配正则表达式

2024-05-21 05:55:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用一个regex行将某个模式与几个字符串匹配(如果可能):

blah blah (1023 mega lbs) blah blah 1245 tons
blah 1023 kilo tons blah blah 1034 metric tons
blah 1023 feet 345 blah
$100 is a lot of money

我想匹配1023和它的单位(磅、吨和英尺),它们可能跟在另一个单词后面,并将其存储为另一个字符串。但是,我必须小心100美元,因为它不是我所关心的度量单位,也不是任何可能跟在这行第一个序列后面的数字。在

我当前的方法有很多嵌套的if statements,例如,对于我的第一行(不起作用):\d*\s(.*)\s\w+有更好的方法吗?在


Tags: 方法字符串is模式单位metricregexlot
2条回答

您可能喜欢使用regex测试程序,例如http://regexpal.com/或{a2}。在

您遇到了一个问题,因为中间的(.*)将贪婪地匹配并最终捕获比您预期的更多的内容。见here。在

注意,我的解决方案应该匹配<number> <scale> <unit>的所有实例,而不仅仅是每行的第一个实例。我把它留给后人。在

(?:[^0-9$]|^)(\d+)\s(\w+)\s(\w+)

在这里,它在起作用,link。在

(?:[^0-9$]|^)表示匹配要么从行首开始,要么前面不是数字或美元符号(?:表示我们不想捕捉它)。然后匹配数字\d+,后面跟着两个单词\w+。你可以用更具描述性的匹配来代替\w+,就像perreal的回答一样。在

import re
with open("input") as f:
    for line in f:
        mo=re.match(r'[^\d]*(\d+).*?(tons|feet|lbs)', line)
        if mo: print mo.group(1), mo.group(2)

输出

^{pr2}$

另外,如果您有一个类似$100 money is too much for 100 lbs的行,则可以使用以下命令:

import re
with open("input") as f:
    for line in f:
        mo=re.match(r'.*?(?<![$\d])(\d+).*?(tons|feet|lbs)', line)
        if mo: print mo.group(1), mo.group(2)

为了配合千斤重的东西:

import re
with open("input") as f:
    for line in f:
        mo=re.match(r'.*?(\d+).*?(mega|kilo|metric|) (tons|feet|lbs)', line)
        if mo: print mo.group(1), mo.group(2), mo.group(3)

输出

1023 mega lbs
1023 kilo tons
1023  feet
100  lbs

可以将这些单元和修饰符存储在列表中,并将它们与|连接起来,以动态创建regex。在

匹配所有可能的单位修饰符的示例:

import re
with open("input") as f:
    for line in f:
        mo=re.match(r'[^\d]*(\d+).*?(\S*)\s*(tons|feet|lbs)', line)
        if mo: print "'{}' '{}' '{}'".format(mo.group(1), mo.group(2), 
                       mo.group(3))

输出

'1023' 'mega' 'lbs'
'1023' 'kilo' 'tons'
'1023' '' 'feet'

相关问题 更多 >