0

我有这个正则表达式模式,当我在 vim 中使用时效果很好:

s/\.[A-Za-z0-9_]*\(IPROC\|IFIX\|IPTAT\)[A-Za-z_]*\([0-9][0-9]*\)[^0-9]*.*([A-Za-z0-9_]*\(IPROC\|IFIX\|IPTAT\)[A-Za-z_]*\([0-9][0-9]*\)[^0-9]*.*)/\3_\4 

我正在寻找类似的东西.jalsdkjflkajsdf_lajsdlfIFIX_100(IFIX_asdf_200)

它将返回:(IFIX_200最后一部分)。我还可以将其设置为返回缓冲区 1 和 2,以便获取IFIX_100(第一部分)。

如何在 python 中使用这个 reg 表达式来返回预期的内容。我已经尝试了 re.findall 和 re.search 中的每一个,但没有运气。

patternI1 = 's/\.[A-Za-z0-9_]*\(IPROC|IFIX|IPTAT\)[A-Za-z_]*\([0-9][0-9]*\)[^0-9]*.*([A-Za-z0-9_]*\(IPROC|IFIX|IPTAT\)[A-Za-z_]*\([0-9][0-9]*\)[^0-9]*.*)/\3_\4'
with open(filename) as input_file:
  for num, line in enumerate(input_file, 1):
    if re.search(patternI1, line):
      x = re.findall(patternI1, line)
    print x
4

1 回答 1

4

离开s/ ... /3_4; 这就是 Vim 的搜索和替换语法。Vim 也以不同的方式使用元字符,不要转义组的(..)括号,但转义文字()括号。

\w是一个很好的快捷方式[A-Za-z0-9_],并且\d会在使用where的地方为[0-9], \Dfor做:[^0-9]\d+\d\d*

patternI1 = r'\.\w*(IPROC|IFIX|IPTAT)\w*?(\d+)\D*.*\(\w*(IPROC|IFIX|IPTAT)\w*?(\d+)\D*.*\)'

我已经\w*在数字组之前调整了模式的贪婪性,以防止它们也吞下太多数字。演示:

>>> import re
>>> sample = '.jalsdkjflkajsdf_lajsdlfIFIX_100(IFIX_asdf_200)'
>>> patternI1 = r'\.\w*(IPROC|IFIX|IPTAT)\w*?(\d\d*)\D*.*\(\w*(IPROC|IFIX|IPTAT)\w*?(\d\d*)\D*.*\)'
>>> re.search(patternI1, sample).groups()
('IFIX', '100', 'IFIX', '200')
于 2013-10-18T21:40:38.000 回答