2014-05-20 3 views
3

Мне интересно, есть ли способ найти только второй кавычек из каждой пары в строке, которая имеет парные кавычки.Регулярное выражение Python для поиска только вторых котировок парных котировок

Итак, если у меня есть строка, как '"aaaaa"' или просто '""' Я хочу найти только последние '"'. Если у меня есть '"aaaa""aaaaa"aaaa""' Я хочу только второй, четвертый и шестой '"' s. Но если у меня есть что-то вроде этого '"aaaaaaaa' или вот так 'aaa"aaa' Я не хочу ничего найти, так как нет парных котировок. Если у меня есть '"aaa"aaa"', я хочу найти только второй '"', так как третий '"' не имеет пары.

Я попытался реализовать lookbehind, но он не работает с квантификаторами, поэтому моя неудачная попытка была '(?<=\"a*)\"'.

+0

ли эти цитаты * внутри * строка, например, '" Ааа "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 о том, почему вы не хотите использовать регулярные выражения для такой задачи, даже если вы можете сделать что-то нерегулярная работа с ним.

Хорошо, тогда вам, вероятно, понадобится одно из решений, которые я даю в связанном ответе, где вы захотите использовать рекурсивное регулярное выражение для соответствия всем совпадающим парам.


Edit: было написано перед обновлением на вопрос, который задавал только вторых двойных кавычек следующего.

Хотя, если вы хотите, чтобы найти только вторые двойные кавычки в строке, вам не нужно регэкспы:

>>> 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 
Смежные вопросы