您好我在使用RegEx和Python时遇到以下问题。
我试图从文本文件中取出以下内容并将其分解为变量(文本文件包含28k +行,而不仅仅是以下文本):
VOLUME 26 4—PART 23
该行中唯一的两个常量值是VOLUME和PART数字交替。
理想情况下,上述字符串将从文本文件中匹配并解析为3个变量。
volume = 26
epitome = 4
part = 23
我试过了:
^.*VOLUME.*$
不幸的是,上面的RegEx在找到单词volume后匹配整个文件。我只需要一行。
提前致谢!
答案 0 :(得分:1)
您可以使用\d
正则表达式模式匹配数字和\D
模式以匹配不是数字的字符。您还需要在要捕获的组周围添加括号,以便match
或findall
返回组。
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)