簡體   English   中英

Python / Regex-匹配兩個字符之間的字符,匹配字符之前或之后的任何字符

[英]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.

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