2016-09-14 127 views
2

所以我一直在玩这个几天,这里是我正在寻找和我现在有的正则表达式。我在这个格式(也有一些其他领域的一个文件,但我省略了那些:python正则表达式匹配多行和其他匹配

我只是想匹配的粗体文字

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

这些行是否将字符串分开?或者它是单一的多行文本?尝试're.findall(r'ADDR 2。*?ADDR 2 - (。*)',s)'没有任何标志。请参阅[本演示](https://regex101.com/r/sR7eU3/1)。 –

+0

尝试使用're.M'('re.MULTILINE')... –

+2

如果您知道它将始终是ADDR1的第二个实例,是不是可以将它们全部捕获到列表中,然后将第2个实例?例如'second_instances = list_of_all_addr1 [1 :: 2]' –

回答

3

代码:

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+(.*) 

Regular expression visualization

Debuggex Demo

让作为线 - 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并存储它。
+0

谢谢你的作品 - 需要调整一下。你能解释一下吗?我会尽快接受你的回答! – user521990

+0

Definitley。将更新回答与解释 –

+0

我刚刚修改它,因为我需要它停在另一个地方,它说地址1. * ADDR \ s + 1- \ s +(。*)\ s + ADDR 2-(让我知道如果这应该是固定的)。出于某种原因,我也需要全球。 – user521990

1

如果想捕捉的东西,然后拆分或隔日实例切片的字符串将是比使用正则表达式快得多 - 下面说明了一个非常基本例如:

分裂()方法:

>>> [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