簡體   English   中英

蟒蛇。 正則表達式不返回輸出

[英]Python. Regular expression not returning output

我正在嘗試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()

給定您顯示的代碼,正則表達式對於您的問題來說是不必要的過度復雜化。 您可以遍歷輸入文件中的行,並轉儲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)都調用re.match(..., line)

您可以嘗試以下正則表達式:PB \\ s?\\(([[0-9] *,?\\ s?)* \\)

您缺少一些東西

  1. 您在字邊界( \\b )和方括號(之間缺少空格
  2. 括號()在正則表達式上下文中具有不同的含義。 括號表示捕獲組。 要從字面上匹配括號,您需要對其進行轉義。

現在要匹配您想要的確切模式,您可以使用this

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

如果只想將行與PB匹配,則可以直接搜索PB

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM