Python正则表达式只能找到配对引号的第二个引号

时间:2014-05-20 12:54:20

标签: python regex lookbehind

我想知道是否有某种方法可以在字符串中找到每对中的第二个引号,它具有成对的引号。

因此,如果我有'"aaaaa"''""'这样的字符串,我想只找到它的最后一个'"'。如果我有'"aaaa""aaaaa"aaaa""'我只想要第二,第四和第六'"'。但是,如果我有类似'"aaaaaaaa'或类似'aaa"aaa'的内容,我不想找到任何内容,因为没有配对引号。如果我有'"aaa"aaa"',我只想找到第二个'"',因为第三个'"'没有配对。

我已尝试实施lookbehind,但它不适用于量词,所以我的不良尝试是'(?<=\"a*)\"'

5 个答案:

答案 0 :(得分: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]

答案 1 :(得分:1)

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

然后

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

给出

"
"

答案 2 :(得分: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

答案 3 :(得分: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,如果有第二个引用,则返回第二个引用的位置。

答案 4 :(得分: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]