多行之间的python正则表达式匹配和其他每行匹配

2024-06-28 18:48:29 发布

您现在位置: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

我编写的regex只匹配第一个addr1-XXXXX,但我需要匹配加粗的XXXXX的所有实例。在

^{pr2}$

有什么建议吗?我觉得我可能错过了一些简单的东西,但不确定。在


Tags: 文件实例格式建议regex省略addr文字
2条回答

如果想要捕获某个对象的其他实例,那么拆分或切片字符串的速度将比使用regex快得多,下面演示了一个非常简单的基本示例:

split()方法:

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

findall()方法:

^{pr2}$

在您知道regex不是绝对必要的情况下,请考虑使用另一种方法。同样,在接受的答案中显示的regex可以被优化以将时间缩短近一半(例如re.findall("ADDR 1 .+ - (.+)", s)-37.0185003658 seconds - 10000000 iterations。在

代码:

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

输出:

^{pr2}$

工作原理:

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

Regular expression visualization

Debuggex Demo

让我们选一行-地址1-XXXXXX ADDR 1-ABCDEF

  • .*ADDR将匹配ADDR 1-XXXXXX ADDR。由于.*匹配任何内容,而且regex本质上是贪婪的,所以为了停止,我在.*之后添加了ADDR
  • \s+1\s+-\s+(.*)将匹配rest1-ABCDEF\s+1\s+-\s+是必需的,因为我们需要匹配addr1而不是addr2(.*)将匹配ABCDEF并存储它。在

相关问题 更多 >