我试图在多行的开始和结束模式之间找到某个模式。这是我的意思:
我读取了一个文件并将其保存在变量File中,这就是原始文件的样子:
文件:
...
...
...
Keyword some_header_file {
XYZ g1234567S7894561_some_other_trash_underscored_text;
XYZ g1122334S9315919_different_other_trash_underscored_text;
}
...
...
...
我正在尝试抓住g和S之间的 1234567 和 1122334 。 some_header_file块可以是任意行,但始终以} 结尾 因此,我尝试从特定关键字的“关键字”到“}”的所有行在g和S之间准确地抓住7位数字。
这就是我用的:
FirstSevenDigitPart = str(re.findall(r"Keyword\s%s.*\n.*XYZ\s[gd]([0-9]{7})[A-Z][0-9]{7}.*\}"%variable , str(File) , flags=re.MULTILINE))
,但不幸的是,它不返回任何内容。 我究竟做错了什么?我怎样才能做到这一点? 预先感谢。
答案 0 :(得分:1)
我认为这里最简单的方法是使用两个表达式并分两步运行它。有一个小例子。当然,您应该根据需要对其进行优化。
import re
text = """Keyword some_header_file {
XYZ g1234567S7894561_some_other_trash_underscored_text;
XYZ g1122334S9315919_different_other_trash_underscored_text;
}"""
all_lines_pattern = 'Keyword\s*%s\s*\{\n(?P<all_lines>(.|\s)*)\}'
first_match = re.match(all_lines_pattern % 'some_header_file', text)
if first_match is None:
# some break logic here
pass
found_lines = first_match.group(1)
print(found_lines) # ' XYZ g1234567S7894561_some_other_trash_underscored_text;\n XYZ g1122334S9315919_different_other_trash_underscored_text;\n '
sub_pattern = '(XYZ\s*[gd](?P<your_pattern>[0-9]{7})[A-Z]).*;'
found_groups = re.findall(sub_pattern, found_lines)
print(found_groups) # [('XYZ g1234567S', '1234567'), ('XYZ g1122334S', '1122334')]
答案 1 :(得分:1)
您可以将文件读入contents
变量中并使用
import re
contents = "...\n...\n...\nKeyword some_header_file {\n XYZ \ng1234567S7894561_some_other_trash_underscored_text;\n XYZ \n1122334S9315919_different_other_trash_underscored_text;\n}\n...\n...\n..."
results = []
variable = 'some_header_file'
block_rx = r'Keyword\s+{}\s*{{([^{{}}]*)}}'.format(re.escape(variable))
value_rx = r'XYZ\s[gd]([0-9]{7})[A-Z][0-9]{7}'
for block in re.findall(block_rx, contents):
results.extend(re.findall(value_rx, block))
print(results)
# => ['1234567', '1122334']
请参见Python demo。
第一个正则表达式(block_rx
)看起来像Keyword\s+some_header_file\s*{([^{}]*)}
,将与您需要在其中搜索值的所有块匹配。第二个正则表达式XYZ\s[gd]([0-9]{7})[A-Z][0-9]{7}
与您需要的匹配,并且返回捕获列表。