[英]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+(.*)
让我们排队-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 .+ - (.+)", s
) 37.0185003658 seconds - 10000000 iterations
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.