python正则表达式匹配多行和每隔一个匹配

时间:2016-09-14 18:33:49

标签: python regex

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

我只想匹配粗体文字

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)

有什么建议吗?我觉得我可能会遗漏一些简单但不确定的东西。

2 个答案:

答案 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>

Regular expression visualization

Debuggex Demo

让我们走一条线 - 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