[英]Parsing string with repeating pattern with regex in Python?
我用Python 腳本逐行讀取文本文件。 我得到的是一個字符串列表,每行一個字符串。 我現在需要將每個字符串解析為更易於管理的數據(即字符串、整數)。
字符串看起來類似於:
現在我想要的是我可以進一步處理的文本文件中每一行的拆分/解析字符串列表,例如:
我想正則表達式最適合實現這一點,我已經設法想出了這個:
(.+)\\s+((\\d+)\\)
,它完美匹配例如 [“door”, "0" ] 代表“door (0)”但是,有些項目需要解析更多數據:
(.+)\\s((\\d+)+\\|\\)
,只匹配 [ "window", "1" ] 表示 "window (1|22|4) 如何重復部分(\\d+)+\\|
的模式匹配 (即“1|”)直到此模式的未定義次數重復的右括號? 要匹配的最后一項將是一個整數,可以用(\\d+)\\)
單獨捕獲。
還有一種方法可以將簡單或擴展的情況與單個正則表達式匹配嗎?
謝謝! 祝大家周末愉快!
這是正則表達式: \\w+ \\((\\d+\\|)*\\d+\\)
。 但是你應該混合使用正則表達式和str.split
data = []
with open("f.txt") as f:
for line in f:
word, numbers = re.search(r"(\w+) \(([^)]+)\)", line).groups()
data.append((word, *numbers.split("|")))
print(data) # [('door', '0'), ('window', '1', '22', '4')]
import re
a = [r'door (0)',
r'window (1|22|4)',
r'toilet (2|6|5|10)'
]
for i in a:
print(re.findall('(\w+)',i))
結果:
['door', '0']
['window', '1', '22', '4']
['toilet', '2', '6', '5', '10']
不是原始正則表達式,而是提取和處理該數據的另一種方法是使用TTP模板
from ttp import ttp
template = """
<macro>
def process_matches(data):
data["numbers"] = data["numbers"].split("|")
return data
</macro>
<group name="{{ thing }}" macro="process_matches">
{{ thing }} ({{ numbers }})
</group>
"""
data = """
door (0)
window (1|22|4)
toilet (2|6|5|10)
"""
parser = ttp(data, template)
parser.parse()
print(parser.result(format="pprint")[0])
上面的代碼會產生
[ { 'door': {'numbers': ['0']},
'toilet': {'numbers': ['2', '6', '5', '10']},
'window': {'numbers': ['1', '22', '4']}}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.