簡體   English   中英

在 Python 中使用正則表達式解析具有重復模式的字符串?

[英]Parsing string with repeating pattern with regex in Python?

我用Python 腳本逐行讀取文本文件 我得到的是一個字符串列表,每行一個字符串。 我現在需要將每個字符串解析為更易於管理的數據(即字符串、整數)。

字符串看起來類似於:

  • “描述(編號)”(例如“門(0)”)
  • “描述(編號|編號|編號)”(例如“窗口(1|22|4)”)
  • “描述(號碼|號碼|號碼|號碼)”(例如“廁所(2|6|5|10)”)

現在我想要的是我可以進一步處理的文本文件中每一行的拆分/解析字符串列表,例如:

  • "窗口 (1|22|4)" -> [ "窗口", "1", "22", "4" ]

我想正則表達式最適合實現這一點,我已經設法想出了這個:

  • (.+)\\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.

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