蟒蛇。正则表达式不返回输出

时间:2017-05-22 16:55:09

标签: python regex python-2.7

我正在尝试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()

3 个答案:

答案 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)

你遗失的东西很少

  1. 您在字边界(\b)和方括号(
  2. 之间缺少空格
  3. 圆括号()在正则表达式上下文中有不同的含义。括号表示捕获组。要从字面上匹配括号,你需要逃避它。
  4. 现在要匹配您想要的确切模式,您可以使用this

    \bPB\s+\((?:\s*\d+\s*,\s*)*\d+\)
    

    如果您只想使用PB匹配行,则可以直接搜索PB