繁体   English   中英

多行之间的python正则表达式匹配以及其他所有匹配

[英]python regex matching between multiple lines and every other match

所以我已经玩了几天,这就是我正在寻找的东西以及我现在拥有的正则表达式。 我有一个这种格式的文件(还有其他一些字段,但我省略了:

我只想匹配粗体

ADDR 1 - XXXXXX   ADDR 1 - **XXXXXX**

ADDR 2 - XXXXXX   ADDR 2 - XXXXXX

ADDR 1 - XXXXXX   ADDR 1 - **XXXXXX**

ADDR 2 - XXXXXX   ADDR 2 - XXXXXX

我编写的正则表达式仅匹配第一个ADDR 1-XXXXX,但是我需要匹配所有粗体XXXXX的实例。

re.findall(r'ADDR 1- .*? ADDR 1-(.*?)(?=ADDR 2-)', lines, re.DOTALL)

有什么建议么? 我觉得我可能缺少一些简单但不确定的东西。

码:

import re

str= """
ADDR 1 - XXXXXX ADDR 1 - ABCDEF

ADDR 2 - XXXXXX ADDR 2 - XXXXXX

ADDR 1 - XXXXXX ADDR 1 - UVWXYZ

ADDR 2 - XXXXXX ADDR 2 - XXXXXX
"""

m = re.findall(r".*ADDR\s+1\s+-\s+(.*)",str)
print m

输出:

C:\Users\dinesh_pundkar\Desktop>python c.py
['ABCDEF', 'UVWXYZ']

C:\Users\dinesh_pundkar\Desktop>

这个怎么运作:

.*ADDR\s+1\s+-\s+(.*)

正则表达式可视化

Debuggex演示

让我们排队-ADDR 1-XXXXXX ADDR 1-ABCDEF

  • .*ADDR将匹配ADDR 1-XXXXXX ADDR 由于.*匹配任何内容,并且正则表达式本质上是贪婪的,所以要停止,我必须在.*之后添加ADDR
  • \\s+1\\s+-\\s+(.*)将匹配其余的1-ABCDEF \\s+1\\s+-\\s+是必需的,因为我们需要匹配ADDR 1而不是ADDR 2 (.*)将匹配ABCDEF并将其存储。

如果要捕获某个事物的所有其他实例,则对字符串进行拆分或切片将比使用regex 快得多 -以下示例展示了一个非常基本的示例:

split()方法:

>>> [i.split('ADDR 1 - ')[-1] for i in s.split('\n')[::2]]
>>> ['AXXXXZ', 'AXXXXY']
>>> ''' 18.3057999611 seconds - 10000000 iterations '''

findall()方法:

>>> re.findall(".*ADDR\s+1\s+-\s+(.*)", s)
>>> ['AXXXXZ', 'AXXXXY']
>>> ''' 77.5003650188 seconds - 10000000 iterations '''

如果您知道regex并非绝对必要,请考虑使用替代方法。 同样,可以对接受的答案中显示的正则表达式进行优化,以将时间缩短近一半(例如re.findall("ADDR 1 .+ - (.+)", s37.0185003658 seconds - 10000000 iterations

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM