[英]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 '
無論如何,一旦有了,就可以split
其split
:
>>> 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.