例如:
a = "bzzzzzz <!-- blabla --> blibli * bloblo * blublu"
我想抓住第一条评论。评论可能是
(<!-- .* -->) or (\* .* \*)
没关系:
re.search("<!--(?P<comment> .* )-->",a).group(1)
还有:
re.search("\*(?P<comment> .* )\*",a).group(1)
但如果我想要评论中的一个或另一个,我尝试过类似的事情:
re.search("(<!--(?P<comment> .* )-->|\*(?P<comment> .* )\*)",a).group(1)
但它不起作用
由于
答案 0 :(得分:2)
尝试条件表达式:
>>> for m in re.finditer(r"(?:(<!--)|(\*))(?P<comment> .*? )(?(1)-->)(?(2)\*)", a):
... print m.group('comment')
...
blabla
bloblo
答案 1 :(得分:1)
正如Gurney指出的那样,你有两个同名的捕获。由于您实际上并未使用该名称,因此请将其删除。
此外,r""
原始字符串符号是一个好习惯。
哦,第三件事:你抓错了指数。 0
是完整匹配,1
是整个“或 - 或”阻止,而2
将是成功的内部捕获。
re.search(r"(<!--( .* )-->|\*( .* )\*)",a).group(2)
答案 2 :(得分:1)
你在“不工作”部分得到的例外是非常明确的错误:
sre_constants.error: redefinition of group name 'comment' as group 3; was group 2
两个组都有相同的名称:只需重命名第二个
>>> re.search("(<!--(?P<comment> .* )-->|\*(?P<comment2> .* )\*)",a).group(1)
'<!-- blabla -->'
>>> re.search("(<!--(?P<comment> .* )-->|\*(?P<comment2> .* )\*)",a).groups()
('<!-- blabla -->', ' blabla ', None)
>>> re.findall("(<!--(?P<comment> .* )-->|\*(?P<comment2> .* )\*)",a)
[('<!-- blabla -->', ' blabla ', ''), ('* bloblo *', '', ' bloblo ')]
答案 3 :(得分:0)
re.findall
可能更适合这个:
import re
# Keep your regex simple. You'll thank yourself a year from now. Note that
# this doesn't include the surround spaces. It also uses non-greedy matching
# so that you can embed multiple comments on the same line, and it doesn't
# break on strings like '<!-- first comment --> fragment -->'.
pattern = re.compile(r"(?:<!-- (.*?) -->|\* (.*?) \*)")
inputstring = 'bzzzzzz <!-- blabla --> blibli * bloblo * blublu foo ' \
'<!-- another comment --> goes here'
# Now use re.findall to search the string. Each match will return a tuple
# with two elements: one for each of the groups in the regex above. Pick the
# non-blank one. This works even when both groups are empty; you just get an
# empty string.
results = [first or second for first, second in pattern.findall(inputstring)]
答案 4 :(得分:0)
你可以选择2种方法中的一种(如果Python支持) -
1:分支复位(?| pattern | pattern | ...)
(?|<!--( .*? )-->|\*( .*? )\*)/
捕获组1始终包含评论文本
2:条件表达式(?(条件)是 - 模式|无模式)
(?:(<!--)|\*)(?P<comment> .*? )(?(1)-->|\*)
这里的条件是我们捕获了grp1
修饰符sg
单行和全局