如何匹配文本文件中的整行并使用Python和RegEx将其分解为变量?

时间:2017-04-28 01:58:08

标签: python regex

您好我在使用RegEx和Python时遇到以下问题。

我试图从文本文件中取出以下内容并将其分解为变量(文本文件包含28k +行,而不仅仅是以下文本):

VOLUME 26 4—PART 23

该行中唯一的两个常量值是VOLUME和PART数字交替。

理想情况下,上述字符串将从文本文件中匹配并解析为3个变量。

volume = 26
epitome = 4
part = 23

我试过了:

^.*VOLUME.*$

不幸的是,上面的RegEx在找到单词volume后匹配整个文件。我只需要一行。

提前致谢!

2 个答案:

答案 0 :(得分:1)

您可以使用\d正则表达式模式匹配数字和\D模式以匹配不是数字的字符。您还需要在要捕获的组周围添加括号,以便matchfindall返回组。

import re
s = "VOLUME 26 4—PART 23"
pattern = re.compile('VOLUME (\d+) (\d+)—PART (\d+)')
print(pattern.findall(s))

如果您不确定VOLUME和PART将始终相同,则可以使用此更通用的模式:

pattern = re.compile('\D+(\d+) (\d+)\D+(\d+)')

运行任一模式打印:

[('26', '4', '23')]

要将结果提取到变量,请将print()行替换为:

result = pattern.findall(s)[0]
volume, epitome, part = (int(i) for i in result)

与可选缩影匹配

您可以将中间项目(缩略图)包装在非捕获组(?:...)中,从而使其可选。使用?跟随它,告诉它匹配0或1次出现,它适用于带或不带缩影的行。如果缺少缩影,result元组中的第二个元素将是一个空字符串''

以下是工作示例:

import re
sl = ["VOLUME 26 4—PART 23", "VOLUME 16 4-PART 7", "VOLUME 12-PART 38"]
pattern = re.compile('\D+(\d+)(?: (\d+))?\D+(\d+)')
for s in sl:
    result = pattern.findall(s)[0]
    volume, epitome, part = (int(i) if i else i for i in result)
    print('"{}": v {}, e {}, p {}'.format(s, volume, epitome, part))

运行它会产生:

"VOLUME 26 4—PART 23": v 26, e 4, p 23
"VOLUME 16 4-PART 7": v 16, e 4, p 7
"VOLUME 12-PART 38": v 12, e , p 38

答案 1 :(得分:0)

在python 2.7中

import re
s = "sdfdsjflsfVOLUME 26 4—PART 23sfldfls = VOLUME 26 4—PART 23sjjkfj"
regex = r"VOLUME.\d+.\d+.[^PART]+PART.\d+"
all_patterns = re.findall(regex, s)
for pattern in all_patterns:
    volume, epitome, part = map(int, re.findall(r'\d+', pattern))
    print(volume, epitome, part)

在python3中

import re
s = "sdfdsjflsfVOLUME 26 4—PART 23sfldfls = VOLUME 26 4—PART 23sjjkfj"
regex = re.compile("VOLUME.\d+.\d+—PART.\d+")
all_patterns = regex.findall(s)
for pattern in all_patterns:
    r = re.compile("\d+")
    volume, epitome, part = map(int, r.findall(pattern))
    print(volume, epitome, part)