Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式和使用s/in模式_Python_Regex - Fatal编程技术网

Python正则表达式和使用s/in模式

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

我有一个正则表达式模式,当我在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表达式来返回预期的结果。我已经试过了每一次搜索,但都没有成功

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:so
patternI1=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:so
patternI1=r'.\w*?(IPROC | IFIX | IPTAT)\w*?(\d\d*)\d*?)?(IPROC | IFIX | IPAT)\w*?(\d\d*)\d*?*?*?*?\)
,然后
re.findall(patternI1,inputstring)