[英]Regular expression to return all characters between two special characters
我如何使用regx返回兩個括號之間的所有字符。 這是一個例子:
foobar['infoNeededHere']ddd
needs to return infoNeededHere
我在大括號之間找到了一個正則表達式,但所有嘗試使用方括號的嘗試都失敗了。 這是正則表達式: (?<={)[^}]*(?=})
這是我試圖破解它
(?<=[)[^}]*(?=])
最終解決方案
import re
str = "foobar['InfoNeeded'],"
match = re.match(r"^.*\['(.*)'\].*$",str)
print match.group(1)
如果您是REG (gular) EX (新聞)的新手,您可以在Python Docs中了解它們。 或者,如果您想要更溫和的介紹,可以查看HOWTO 。 他們使用Perl風格的語法。
你需要的表達式是.*?\\[(.*)\\].*
。 你想要的小組將是\\1
。
- .*?
: .
匹配任何字符,但換行。 *
是元字符,表示重復此次0次或更多次 。 ?
使*
非貪婪,即.
在擊中'['之前,將盡可能少的字符匹配。
- \\[
: \\
轉義特殊元字符,在本例中為[
。 如果我們不這樣做, [
會做一些非常奇怪的事情。
- (.*)
:括號'分組'其中的任何內容,您可以稍后通過其數字ID或名稱檢索組(如果它們被賦予一個)。
- \\].*
:你現在應該足夠了解這意味着什么。
首先,將re
模塊 - 它不是內置的 - 導入到你想要使用表達式的地方。
然后,使用re.search(regex_pattern, string_to_be_tested)
搜索要測試的字符串中的模式。 這將返回一個MatchObject
,您可以將其存儲到臨時變量中。 然后,您應該調用它的group()
方法並將1作為參數傳遞(以查看我們之前使用括號捕獲的“組1”)。 我現在應該看起來像:
>>> import re
>>> pat = r'.*?\[(.*)].*' #See Note at the bottom of the answer
>>> s = "foobar['infoNeededHere']ddd"
>>> match = re.search(pat, s)
>>> match.group(1)
"'infoNeededHere'"
您還可以使用findall()
通過將正則表達式修改為(?>=\\[).+?(?=\\])
來查找所有非重疊匹配。
- (?<=\\[)
: (?<=)
被稱為后視斷言並檢查實際匹配之前的表達式。
- .+?
: +
就像*
只是它匹配一個或多個repititions。 它是非貪婪的?
。
- (?=\\])
(?=)
是前瞻判斷和檢查表達式跟隨比賽的w / o捕獲它。
您的代碼現在應該如下所示:
>>> import re
>>> pat = r'(?<=\[).+?(?=\])' #See Note at the bottom of the answer
>>> s = "foobar['infoNeededHere']ddd[andHere] [andOverHereToo[]"
>>> re.findall(pat, s)
["'infoNeededHere'", 'andHere', 'andOverHereToo[']
注意:始終使用原始Python字符串,在字符串前添加“r”(例如: r'blah blah blah'
)。
10倍閱讀! 當沒有被接受的時候我寫了這個答案,但是當我完成它的時候,有2個礦石出現了,一個被接受了。 :( x <
如果每行只有一個[.....]
標記,那么你根本不需要使用正則表達式:
In [7]: mystring = "Bacon, [eggs], and spam"
In [8]: mystring[ mystring.find("[")+1 : mystring.find("]") ]
Out[8]: 'eggs'
如果每行不止一個,那么你需要修改Jarrod的正則表達式^.*\\['(.*)'\\].*$
以匹配每行多次,並且非貪婪。 (使用.*?
量詞而不是.*
量詞。)
In [15]: mystring = "[Bacon], [eggs], and [spam]."
In [16]: re.findall(r"\[(.*?)\]",mystring)
Out[16]: ['Bacon', 'eggs', 'spam']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.