簡體   English   中英

正則表達式返回兩個特殊字符之間的所有字符

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

^.*\\['(.*)'\\].*$將匹配一行並捕獲組中的內容。

你必須逃避[]\\

rubular.com 證明鏈接中的文檔將解釋表達式是如何形成的。

如果每行只有一個[.....]標記,那么你根本不需要使用正則表達式:

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.

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