2017-06-16 50 views
0

我有以下格式Python的正則表達式匹配枚舉列表

string = 'Some text.\n1. first item\n2. second item\n3. third item\nSome more text.' 

我想匹配的是子\n1. first item\n2. second item\n3. third item,有效,在字符串中枚舉列表的Python字符串。對我而言,我做不是必然需要匹配第一個\n

我試過到目前爲止:

  • re.findall('\n.*\d\..*', req, re.DOTALL)
  • re.findall('\n.*\d\..*?', req, re.DOTALL)

第一種情況發現,我不希望文本的最後一行,和第二種情況沒有找到第3行的其餘部分。我面臨的關鍵困難是我不知道如何製作第一個貪婪(並通過換行符匹配),但是使第二個.*只匹配一個換行符。

注意:枚舉字符串中的項數是未知的,所以我不能只匹配三個數字的行。它可以是任意數量的行。提供的字符串只是一個恰好有三個枚舉項的示例。

+0

它是否必須匹配列表中的所有項目在一個大字符串或匹配每個項目,然後將每個項目添加到集合可接受? –

+0

@LewsTherin我想後者是可以接受的,我只是希望一個正則表達式命令能夠處理這個問題,特別是我可以在單個字符串中匹配多個不同的枚舉列表。 – zephyr

回答

1

如何使用逐行匹配和過濾器?

string = 'Some text.\n1. first item\n2. second item\n3. third item\nSome more text.' 
is_enumerated = re.compile(r"^\d+\.\s") 

matches = list(filter(lambda line: is_enumerated.match(line), string.splitlines())) 
# ['1. first item', '2. second item', '3. third item'] 

您可以\n現在參加的比賽,如果你想。

+1

爲什麼不只是're.findall('\ d \ .. *',string)'? – zephyr

+0

因爲我沒有想到,簡單明瞭。 :)你的建議更好。 – Tomalak