我正在尝试findall
字符串"PB"
的实例及其后面的数字,但是当我打电话时。
number_all = re.findall(r'\bPB\b([0-9])\d+', ' '.join(number_list))
([0-9])\d+
没有返回输出。我查看了我的输出文件sequence.txt
,但里面没有任何内容。如果我只是\bPB\b
,则输出"PB"
但不输出数字。
我的输入文件raw-sequence.txt
如下所示:
WB (19, 21, 24, 46, 60)
WB (12, 11, 9, 23, 49)
PB (18, 21, 10, 5, 5)
WB (2, 14, 2, 29, 67)
WB (1, 8, 1, 16, 52)
PB (2, 11, 8, 3, 4)
如何将以下行输出到sequence.txt?
PB (18, 21, 10, 5, 5)
PB (2, 11, 8, 3, 4)
这是我目前的代码:
sequence_raw_buffer = open('c:\\sequence.txt', 'a')
with open('c:\\raw-sequence.txt') as f:
number_list = f.read().splitlines()
number_all = re.findall(r'\bPB\b([0-9])\d+', ' '.join(number_list))
unique = list(set(number_all))
for i in unique:
sequence_raw_buffer.write(i + '\n')
print "done"
f.close()
sequence_raw_buffer.close()
答案 0 :(得分:2)
鉴于您显示的代码,正则表达式是您的问题不必要的过度复杂。您可以迭代输入文件中的行并转储line.startswith("PB")
返回True
的行。
with open(r'c:\raw-sequence.txt', 'r') as f, open(r'c:\sequence.txt', 'a') as sequence_raw_buffer:
for line in f:
if line.startswith("PB"):
print(line, file=sequence_raw_buffer)
这表明文件可以逐行迭代。我使用print来转储该行,因为它会附加for
循环剥离的正确行终止符。
此示例还向您展示了如何将多个上下文管理器放入单个with
块中。您应该将所有文件都放在with
块中,无论是输入还是输出,因为I / O错误可能是双向的。
现在,如果您正在尝试使用正则表达式练习,或者因为匹配比您在此处所呈现的更复杂,您可以尝试
PB\s*\((?:\d+,\s*)*\d+\)
匹配如下:
PB
\s*
\(
(?:)*
,根据需要重复多次,包含
\d+
,
\s*
\d
\)
我不打算将整个文件连接在一起并使用findall
,除非你的表达式可以跨越多行。我宁愿仍然使用上面显示的方法,因为除了少数几个我能想到的情况外,文本数据通常会被换行符分隔:
pattern = re.compile('PB\s*\((?:\d+,\s*)*\d+\)')
...
if pattern.match(line):
...
预编译模式一次使程序运行得更快,但您也可以每次都调用re.match(..., line)
。
答案 1 :(得分:0)
你可以试试这个正则表达式:PB \ s?\(([0-9] *,?\ s?)* \)
答案 2 :(得分:0)
你遗失的东西很少
\b
)和方括号(
()
在正则表达式上下文中有不同的含义。括号表示捕获组。要从字面上匹配括号,你需要逃避它。现在要匹配您想要的确切模式,您可以使用this
\bPB\s+\((?:\s*\d+\s*,\s*)*\d+\)
如果您只想使用PB
匹配行,则可以直接搜索PB