所以我已经玩了好几天了,这就是我要找的和我现在的正则表达式。我有一个这种格式的文件(还有其他一些字段,但我省略了这些:
我只想匹配粗体文字
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)
有什么建议吗?我觉得我可能会遗漏一些简单但不确定的东西。
答案 0 :(得分:3)
<强>代码:强>
import time
import webbrowser
break_times = 3
break_count = 0
print ("Program started at: " + time.ctime())
while break_count < break_times :
time.sleep(5)
webbrowser.open("https://www.youtube.com/watch?v=m69d-KNi2Q0")
break_count = break_count + 1
<强>输出:强>
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 1 - XXXXXX ADDR 1 - ABCDEF
.*ADDR\s+1\s+-\s+(.*)
将匹配 ADDR 1 - XXXXXX ADDR 。由于.*ADDR
匹配任何内容,因此正则表达式是贪婪的,所以要停止我在.*
之后添加ADDR
.*
将匹配其余 1 - ABCDEF 。 \s+1\s+-\s+(.*)
是必需的,因为我们需要匹配 ADDR 1 而不是 ADDR 2 。 \s+1\s+-\s+
将匹配 ABCDEF 并存储它。答案 1 :(得分:1)
如果想要捕获某些内容的其他实例,那么拆分或切片字符串将比使用正则表达式快得多 - 以下演示了一个非常基本的示例:
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 '''
在您知道正则表达式不是绝对必要的情况下,请考虑使用替代方法。此外,接受的答案中显示的正则表达式可以进行优化,以将时间减少近一半(例如re.findall("ADDR 1 .+ - (.+)", s
) - 37.0185003658 seconds - 10000000 iterations
。