Python正则表达式和使用s/in模式
我有一个正则表达式模式,当我在vim中使用它时,效果非常好:Python正则表达式和使用s/in模式,python,regex,Python,Regex,我有一个正则表达式模式,当我在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
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表达式来返回预期的结果。我已经试过了每一次搜索,但都没有成功
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
s/…的左边/3_4
;这就是Vim搜索和替换语法。Vim也以不同的方式使用元字符,不要转义组的(..)
括号,而是转义文本()
括号
\w
是[a-Za-z0-9\
的一个很好的快捷方式,\d
适用于[0-9]
,\d
适用于[^0-9]
,使用\d+
的地方使用\d\d*/code>:
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')
s/…的左边/3_4
;这就是Vim搜索和替换语法。Vim也以不同的方式使用元字符,不要转义组的(..)
括号,而是转义文本()
括号
\w
是[a-Za-z0-9\
的一个很好的快捷方式,\d
适用于[0-9]
,\d
适用于[^0-9]
,使用\d+
的地方使用\d\d*/code>:
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')
当正则表达式中有反斜杠时。在引号前加上“r”。r'something('当正则表达式中有反斜杠时,在引号前加上“r”。r'something(‘作为OP的参考,Python使用的是Perl的正则表达式语法,而Vim使用的是UNIX正则表达式语法。这就是为什么不能在Python中直接使用Vim正则表达式,反之亦然。如果我的示例中有两个实例在同一行中,会发生什么情况?它会返回全部8个表达式吗?@user2658799:它只返回前4个表达式;您会看到必须使所有的*
量词都不贪婪(如果还没有的话,给它们添加一个?
),然后使用re.findall()
而不是re.search()
来返回一个元组列表;该列表中的每个条目都是一个包含4个值的元组。@user2658799:sopatternI1=r'\.\w*?(IPROC | IFIX | IPTAT)\w*(\d\d*)\d*)\d*?。*。(\w*?)?(IPROC | IFIX | IPAT)\w*?(\d\d*)\d*?*?*?。\)
,然后re.findall(patternI1,inputstring)
。作为OP的参考,Python使用的是Perl的正则表达式语法,而Vim使用的是UNIX正则表达式语法。这就是为什么不能在Python中直接使用Vim regex,反之亦然。如果我在同一行中有两个实例,会发生什么?它会返回所有8个表达式吗?@user2658799:它只返回前4个;您必须使所有的*
量词都不贪婪(如果还没有的话,就给它们添加一个?
),然后使用re.findall()
而不是re.search()
来返回一个元组列表;该列表中的每个条目都是一个包含4个值的元组。@user2658799:sopatternI1=r'.\w*?(IPROC | IFIX | IPTAT)\w*?(\d\d*)\d*?)?(IPROC | IFIX | IPAT)\w*?(\d\d*)\d*?*?*?*?\)
,然后re.findall(patternI1,inputstring)
。