簡體   English   中英

Python RegEx僅匹配內部正則表達式

[英]Python RegEx matching only the inside regex

我前一段時間已經在StackOverflow上找到了解決此問題的方法,但無法再次找到解決方案。 我想從字符串中提取模式。

my_string ='hello ,mister synonyms: fine, of high quality, of a high standard, quality, superior; More'

我要提取'fine, of high quality, of a high standard, quality, superior'

我用了

match_obj = re.search(r'(synonyms: )((\w+,|; )+)', my_string)
print(match_obj.group(2))

它只給出'fine,'我知道在這種情況下我為嵌套括號編寫正則表達式的方式出了問題,但是我找不到正確的編寫方式。

您可以先獲取帶有逗號分隔值的子字符串(可以使用(?<=synonyms: )[^;]+正則表達式,僅匹配1個或多個字符;synonyms: substring除外),然后使用\\s*,\\s*正則表達式(由於與\\s*匹配的空格,它也會修剪值)以獲取必要的值:

import re
p = re.compile(r'(?<=synonyms: )[^;]+')
test_str = "hello ,mister synonyms: fine, of high quality, of a high standard, quality, superior; More"
o = re.search(p, test_str)
if o:
    s = o.group()
    print re.split(r"\s*,\s*", s)

IDEONE演示

UPDATE

由於您打算學習捕獲組和非捕獲組,因此這里是固定的正則表達式:

(synonyms: )((?:\s*\w+,?)+)

並說明:

  • (synonyms: ) -第一個匹配字面意義上的捕獲組synonyms:
  • ((?:\\s*\\w+,?)+) -匹配的第二個捕獲組
    • (?:\\s*\\w+,?)+ -1個或多個非捕獲序列(即不會存儲在堆棧中)
      • \\s* -0個或更多空白字符
      • \\w+ -1個或多個單詞字符( [A-Za-z0-9_]
      • ,? -0或1個逗號

演示可以在這里找到

注意4件事:

  1. 您不必捕獲文字文本。 您已經知道它們了,這沒有任何意義。

  2. Python re engine不能像.NET(其中具有.Captures屬性)那樣記住多個捕獲組,因此,我們不能使用捕獲組輕松地獲取所有單獨的逗號分隔值。 Python也不在正則表達式中支持\\G來獲取連續的匹配項。

  3. 要獲取單個條目,在Python中,我們必須將獲取字符串拆分為第二步(當然,如果需要的話)。

  4. 考慮到優化,您可以看到在正則表達式中, (?:\\s*\\w+,?)+部分看起來很棘手,但要點是,所有三個組件- \\s\\w, 不能匹配相同的文本 當您編寫非常復雜的正則表達式並將整個+量設置為整組時,務必遵循相同的策略。

如果您只是想匹配"synonyms: "";" ,則可以使用以下之一:

(synonyms: )([\w, ]+|[^;])+
(synonyms: )(\w+, [^;]+)+
(synonyms: )(.+)(?=;)
(synonyms: )([^;]+)

如果我理解正確,那么您想匹配所有synonyms:后的內容synonyms:最多分號?

r'(synonyms: )([\w, ]+)'

實際觀看: https//regex101.com/r/jI0dV4/1

我認為您的正則表達式中的缺陷實質上是|的位置。 這使得正則表達式匹配任一 \\w, ;__表示空間)

請注意,帶有圓括號的分組始終會引入新的捕獲組。 我使用方括號列出了允許的字符。

如果您點擊鏈接 ,則可以嘗試其他操作,並獲得即時結果和說明。

這將捕獲“同義詞:”和“;”之間的所有內容。 變成一個字符串。 因為正向后方(?<=synonyms: ) :)是零寬度的非捕獲斷言,所以唯一的捕獲組將為零([^;]+)

test_str = "hello ,mister synonyms: fine, of high quality, of a high standard, quality, superior; More"
regex = re.compile(r'(?<=synonyms: )([^;]+)')
string = regex.search(test_str).group(0)

print(string)

暫無
暫無

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

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