我想知道是否有某种方法可以在字符串中找到每对中的第二个引号,它具有成对的引号。
因此,如果我有'"aaaaa"'
或'""'
这样的字符串,我想只找到它的最后一个'"'
。如果我有'"aaaa""aaaaa"aaaa""'
我只想要第二,第四和第六'"'
。但是,如果我有类似'"aaaaaaaa'
或类似'aaa"aaa'
的内容,我不想找到任何内容,因为没有配对引号。如果我有'"aaa"aaa"'
,我只想找到第二个'"'
,因为第三个'"'
没有配对。
我已尝试实施lookbehind,但它不适用于量词,所以我的不良尝试是'(?<=\"a*)\"'
。
答案 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)
如果您需要更改第二个引号,您还可以匹配整个字符串,并将第二个引用之前的模式放入捕获组。然后通过第一个匹配组+替换字符串进行替换将存档问题。
例如,此正则表达式将匹配第二个引用之前的所有内容并将其放入组
(\"[^"]*)\"
如果您仅用捕获组的值(不包括第二个引号)替换整个匹配(包括第二个引用),那么您只需将其剪掉。
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]