[英]Python/Regex - match char between two chars, with anything before or after the matching char
我正在嘗試在一個字符子集中匹配一個字符,其中匹配字符的任一側都可以是任何東西。
這是一個例子:
{{ SITE_AGGREGATE_SUBNET }}.3 remote-as {{ BGP-AS }}
針對上述問題,我想匹配{{和}}之間的任何帶有破折號“-”的內容。
到目前為止,我的正則表達式模式是:
(?<={{)(.*?-.*?)(?=}})
但這為返回的整個測試字符串創建了一個匹配項:
SITE_AGGREGATE_SUBNET }}.3 remote-as {{ BGP-AS
有人能看到我所缺少的嗎? 我了解為什么我的正則表達式無法按預期運行,但無法解決該問題。
謝謝
您可以將此正則表達式與負前瞻和捕獲組一起使用:
({{(?:(?!{{|}})[^-])*)-(.*?}})
正則表達式詳細信息:
(
:開始捕獲組
{{
:匹配{{
(?:
啟動非捕獲組
(?{{|!}})
:負向超前斷言我們在下一個位置沒有{{
和}}
[^-]
:匹配除連字符以外的任何字符 )*
:結束非捕獲組。 *
匹配該組的0+個實例 )
:結束捕獲組 -
:匹配文字連字符 (.*?}})
:將剩余的字符串匹配到}}
,然后匹配}}
並將其捕獲到第二個捕獲組中 采用
import re
s = '{{ SITE_AGGREGATE_SUBNET }}.3 remote-as {{ BGP-AS }}'
print([x.strip() for x in re.findall(r'{{(.*?)}}', s) if '-' in x])
// -> ['BGP-AS']
參見Python演示
細節
{{(.*?)}}
正則表達式提取{{...}}
之間的所有匹配項(請注意, re.findall
將僅返回捕獲的減號,該值與(.*?)
匹配) if '-' in x
)將匹配保留為-
。 .strip()
刪除尾隨/前導空格 單個正則表達式方法(請注意,結果可能效率較低):
re.findall(r'{{\s*((?:(?!{{|}})[^-])*-.*?)\s*}}', s)
參見Python演示
細節
{{
- {{
\\s*
-0+空格 ((?:(?!{{|}})[^-])*-.*?)
-捕獲組1( re.findall
將返回什么):
(?:(?!{{|}})[^-])*
-與任何非連字符char相匹配的經過調和的貪婪令牌 (0+次以上),不會啟動{{
和}}
子字符串 -
連字符 .*?
-任意0個以上的字符(LF除外),盡可能少 \\s*
-0+空格 }}
- }}
。 您可以使用以下模式: {{(.*?)}}
。
.*?
非貪婪地匹配任何字符流。
(...)
創建一個捕獲組,因此re.findall
產生括號的內部。
要檢查是否匹配包含'-'
,這可能是簡單的,然后使用in
。
import re
def tokenize(s):
return [w.strip() for w in re.findall('{{(.*?)}}', s) if '-' in w]
print(tokenize('{{ SITE_AGGREGATE_SUBNET }}.3 remote-as {{ BGP-AS }}'))
['BGP-AS']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.