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

2024-10-01 15:37:40 发布

您现在位置:Python中文网/ 问答频道 /正文

您好,我有以下关于RegEx和Python的问题。你知道吗

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

VOLUME 26 4—PART 23

行中只有两个常量值是VOLUME和PART,数字交替。你知道吗

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

volume = 26
epitome = 4
part = 23

我试过:

^.*VOLUME.*$

不幸的是,在找到单词volume之后,上面的正则表达式与整个文件匹配。我只需要一条线。你知道吗

提前谢谢!你知道吗


Tags: 文件字符串文本情况数字单词regex常量
2条回答

在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)

您可以使用\dregex模式来匹配数字,\D模式来匹配非数字字符。您还需要在要捕获的组周围包含括号,以便matchfindall返回这些组。你知道吗

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

如果您不确定卷和部分是否总是相同的,您可以使用以下更通用的模式:

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

相关问题 更多 >

    热门问题