2014-05-20 30 views
3

我想知道是否有某種方法可以從每個字符串中的每一對中找到第二個引號,該引號中有成對的引號。Python正則表達式找到配對引號的第二個引號

所以,如果我有字符串像'"aaaaa"'或只是'""'我只想找到它的最後'"'。如果我有'"aaaa""aaaaa"aaaa""'我只想要第二,第四和第六'"' s。但如果我有這樣的東西'"aaaaaaaa'或像這樣'aaa"aaa'我不想找到任何東西,因爲沒有配對的引號。如果我有'"aaa"aaa"'我只想找到第二個'"',因爲第三個'"'沒有配對。

我試圖實現lookbehind,但它不適用於量詞,所以我的不良嘗試是'(?<=\"a*)\"'

+0

是這些報價* *裏面的字符串,例如'' 「AAA」 aa''? – jonrsharpe

+0

是的,他們在字符串中,正確的 – Alexey

+1

你想擺脫什麼?引號本身?他們的指數?你如何確定哪些報價是一對? – jonrsharpe

回答

1
import re 
reg = re.compile(r'(?:\").*?(\")') 

然後

for match in reg.findall('"this is", "my test"'): 
    print(match) 

" 
" 
0

請閱讀my answer爲什麼你不想使用正則表達式對於這樣的問題,即使你能做到那樣的非正規的工作。

好吧,那麼你可能想要在鏈接答案中給出的解決方案之一,在那裏你要使用遞歸正則表達式來匹配所有匹配對。


編輯:下面的更新的問題,這是隻要求雙引號之前已被寫入。

但如果你想找到僅次於雙引號在一個字符串,你不需要正則表達式:

>>> s1='aoeu"aoeu' 
>>> s2='aoeu"aoeu"aoeu' 
>>> s3='aoeu"aoeu"aoeu"aoeu' 
>>> def find_second_quote(s): 
...  pos_quote_1 = s2.find('"') 
...  if pos_quote_1 == -1: 
...   return -1 
...  pos_quote_2 = s[pos_quote_1+1:].find('"') 
...  if pos_quote_2 == -1: 
...   return -1 
...  return pos_quote_1+1+pos_quote_2 
... 
>>> find_second_quote(s1) 
-1 
>>> find_second_quote(s2) 
4 
>>> find_second_quote(s3) 
4 
>>> 

這裏,要麼返回-1如果沒有第二次試舉,或位置第二個報價,如果有的話。

2

你並不真的需要這樣的正則表達式。你可以這樣做:

[i for i, c in enumerate(s) if c == '"'][1::2] 

得到每隔一個'"'索引。示例用法:

>>> for s in ['"aaaaa"', '"aaaa""aaaaa"aaaa""', 'aaa"aaa', '"aaa"aaa"']: 
    print(s, [i for i, c in enumerate(s) if c == '"'][1::2]) 


"aaaaa" [6] 
"aaaa""aaaaa"aaaa"" [5, 12, 18] 
aaa"aaa [] 
"aaa"aaa" [4] 
+0

這很聰明 - 枚舉+切片,我喜歡它。 –

0

解析器可能更好,但取決於您想從中得到什麼,還有其他方法。如果你需要引號之間的數據:

import re 
re.findall(r'".*?"', '"aaaa""aaaaa"aaaa""') 
['"aaaa"', 
'"aaaaa"', 
'""'] 

,如果你需要的指數,你可以做到這一點作爲發電機或其他等效像這樣:

def count_quotes(mystr): 
    count = 0 
    for i, x in enumerate(mystr): 
     if x == '"': 
       count += 1 
       if count % 2 == 0: 
        yield i 

list(count_quotes('"aaaa""aaaaa"aaaa""')) 
[5, 12, 18] 
1

如果您需要的是改變第二個報價你也可以匹配整個字符串,並把之前的模式第二個報價放入一個捕獲組。然後使第一個匹配組的替換+替換字符串將歸檔該問題。

例如,此正則表達式將在第二次試舉之前匹配一切,把它變成一組

(\"[^"]*)\" 

如果更換整個比賽(包括第二個引號)由捕獲組的唯一值(不包括第二個報價),那麼你只是把它關掉。

online example

import re 
p = re.compile(ur'(\"[^"]*)\"') 
test_str = u"\"test1\"test2\"test3\"" 
subst = r"\1" 

result = re.sub(p, subst, test_str) 
print result #result -> "test1test2"test3