簡體   English   中英

python匹配多行

[英]python match over multiple lines

我正在嘗試提取多行字符串的一部分。 具體來說,我想拉出中間一對大括號之間的術語列表:

'my datagroup 2.5 {\n    nose-capabilities {\n        none\n        slow\n        800\n        1200\n    }\n}\n'

我已經試過了:

re.findall('.*{.*{(?:\s*(\S+)\s*)*}\s*}', d, re.S)

# ['1200']

因此,據我所知,我只能獲得最后的捕獲。

如果您嘗試使用正則表達式執行此操作,則最好使用re.search和先行斷言。

>>> re.search(r'(?s){(?!.*{)([^}]*)', d).group(1).split()
['none', 'slow', '800', '1200']

我認為您錯過了findall 對於整個模式的每次匹配,它都返回一個值。 如果您希望在一個模式中有多個組,那很好,但是您不需要findall

實際上,您實際上不需要。 您可以僅用(.*?)替換模式的整個中間部分,以輕松捕獲第二個開括號和第一個閉括號之間的所有內容。

注意非貪婪的匹配; 否則,它將吸收所有內容直到最后一個大括號,而不是第一個 (您可以為此使用前瞻性斷言,但非貪心匹配更簡單。)

>>> re.findall('.*{.*{(.*?)}', d, re.S)
['\n        none\n        slow\n        800\n        1200\n    ']

盡管findall當然仍然不能為您帶來任何好處:

>>> re.search('.*{.*{(.*?)}', d, re.S).group(1)
'\n        none\n        slow\n        800\n        1200\n    '

無論如何,一旦有了,就可以splitsplit

>>> re.search('.*{.*{(.*?)}', d, re.S).group(1).split()
['none', 'slow', '800', '1200']

回答任意數量的嵌套括號:

s = 'my datagroup 2.5 {\n    nose-capabilities {\n        none\n        slow\n        800\n        1200\n    }\n}\n'
# the position of the inner brace
start = s.rfind('{') + 1
end = s.find('}')
# find alphanumeric characters in substring
re.findall('\w+', s[start:end])

暫無
暫無

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

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