[英]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?)* \\)
您缺少一些東西
\\b
)和方括號(
之間缺少空格 ()
在正則表達式上下文中具有不同的含義。 括號表示捕獲組。 要從字面上匹配括號,您需要對其進行轉義。 現在要匹配您想要的確切模式,您可以使用this
\bPB\s+\((?:\s*\d+\s*,\s*)*\d+\)
如果只想將行與PB
匹配,則可以直接搜索PB
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.