我正在尝试编写一个正则表达式来匹配可选的引用值(有效引号为"'
和`)。
规则是两个引号的出现是一个转义引用。
这是我提出的正则表达式:
(?P<quote>["'`])?(?P<value>(?(quote)((?!(?P=quote).)|((?=(?P=quote)).){2})*|[^\s;]*))(?(quote)(?P=quote)|)
现在可读(注释表明我的想法):
(?P<quote>["'`])? #named group Quote (any quoting character?)
(?P<value> #name this group "value", what I am interested in
(?(quote) #if quoted
((?!(?P=quote).)|((?=(?P=quote)).){2})* #see below
#match either anything that is not the quote
#or match 2 quotes
|
[^\s;]* #match anything that is not whitespace or ; (my seperators if there are no quotes)
)
)
(?(quote)(?P=quote)|) #if we had a leeding quote we need to consume a closing quote
对于不带引号的字符串执行罚款,引用字符串使其崩溃:
match = re.match(regexValue, line)
File "****/jython2.5.1/Lib/re.py", line 137, in match
return _compile(pattern, flags).match(string)
RuntimeError: maximum recursion depth exceeded
我做错了什么?
修改:示例输入=&gt;输出(用于捕获组'值'(所需)
text => text
'text' => text
te xt => te
'te''xt'=> te''xt #quote=' => strreplace("''","'") => desired result: te'xt
'te xt' => te xt
edit2 :在看着它的同时我注意到了一个错误,请参阅下文,但我相信上面的内容仍然是一个有效的re +&gt;它可能是一个Jython错误,但它仍然没有做我想做的事情:(非常微妙的差异,点移出了前瞻组
new:(?P<quote>["'`])?(?P<value>(?(quote)((?!(?P=quote)).|((?=(?P=quote)).){2})*|[^\s;]*))(?(quote)(?P=quote)|)
old:(?P<quote>["'`])?(?P<value>(?(quote)((?!(?P=quote).)|((?=(?P=quote)).){2})*|[^\s;]*))(?(quote)(?P=quote)|)
答案 0 :(得分:3)
正如评论中所建议的那样,我建议明确并写下所有可能性:
r = r"""
([^"'`]+)
|
" ((?:""|[^"])*) "
|
' ((?:''|[^'])*) '
|
` ((?:``|[^`])*) `
"""
提取匹配项时,您可以使用只填充一组四个的事实,并简单地删除所有空组:
r = re.compile(r, re.X)
for m in r.findall(''' "fo""o" and 'bar''baz' and `quu````x` '''):
print ''.join(m)
答案 1 :(得分:0)
如果我正确理解你的问题,给出一个包含3种不同类型报价的字符串
“你好,先生”,说'猴子',
nonchalantly
。
您想要提取引用的值。在这种情况下,他们将是:
您好,先生
猴
若无其事地
以下表达式提取这些:
>>> expr = "\"(.*?)\"|'(.*?)'|`(.*?)`"
观察:
>>> s = """
"Hello, sir", said the 'monkey', `nonchalantly`.
"""
>>> import re
>>> m = re.finditer(expr, s)
>>> for match in m:
... print match.group()
...
('Hello, sir', None, None)
(None, 'monkey', None)
(None, None, 'nonchalantly')
顺便说一下,你自己的正则表达式似乎适用于我的python版本(Mac OSX 10.7.4上的cPython 2.7.2),但会产生错误的结果。
答案 2 :(得分:0)
我在一点点fiddeling之后找到了解决方案:
good:(?P<quote>["'`])?(?P<value>(?(quote)((?!(?P=quote)).|((?=(?P=quote)).){2})*|[^;\s]*))(?(quote)(?P=quote)|)
bad :(?P<quote>["'`])?(?P<value>(?(quote)((?!(?P=quote)).|((?=(?P=quote)).){2})*|[^\s;]*))(?(quote)(?P=quote)|)
并且我不理解差异