[英]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)
由於您打算學習捕獲組和非捕獲組,因此這里是固定的正則表達式:
(synonyms: )((?:\s*\w+,?)+)
並說明:
(synonyms: )
-第一個匹配字面意義上的捕獲組synonyms:
((?:\\s*\\w+,?)+)
-匹配的第二個捕獲組
(?:\\s*\\w+,?)+
-1個或多個非捕獲序列(即不會存儲在堆棧中)
\\s*
-0個或更多空白字符 \\w+
-1個或多個單詞字符( [A-Za-z0-9_]
) ,?
-0或1個逗號 注意4件事:
您不必捕獲文字文本。 您已經知道它們了,這沒有任何意義。
Python re
engine不能像.NET(其中具有.Captures
屬性)那樣記住多個捕獲組,因此,我們不能使用捕獲組輕松地獲取所有單獨的逗號分隔值。 Python也不在正則表達式中支持\\G
來獲取連續的匹配項。
要獲取單個條目,在Python中,我們必須將獲取字符串拆分為第二步(當然,如果需要的話)。
考慮到優化,您可以看到在正則表達式中, (?:\\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.