如何用Python正则表达式匹配双字符异常?
我有一个字符串和正则表达式的查找结果:
txt = """
dx d_2,222.22 ,,
dy h..{3,333.33} ,,
dz b#(1,111.11) ,, dx-ay relative 4,444.44 ,,
"""
for n in re.findall( r'([-\w]+){1}\W+([^,{2}]+)\s+,,\W+', txt ) :
axis, value = n
print "a:", axis
print "v:", value
在第二个(值)组里,我想匹配任何东西,除了两个逗号,但似乎只抓到了一个 ","。在这个例子中,我可以用简单的 (.*?) 来实现,但出于某些原因,我必须匹配所有内容,除了 ",,"。谢谢。
补充:如果想看看我想要实现的效果,可以直接使用 r'([-\w]+){1}\W+(.*?)\s+,,\W+'。这样会得到这样的输出:
a: dx
v: d_2,222.22
a: dy
v: h..{3,333.33}
a: dz
v: b#(1,111.11)
a: dx-ay
v: relative 4,444.44
补充 #2:请注意,之前的回答没有考虑到两个逗号的例外,这并不是我需要的。有没有解决方案...应该有的。所以模式是:
任何空格 - 一个可能带有 "-" 的单词 - 然后是 " " - 以及所有内容,直到 ",,",但不包括它本身。
相关问题:
2 个回答
1
r'(?<=,,)\s+([-\w]+)\s(.*?)(?:,,)' 是这里需要的表达式。比我想象的要简单得多。
r'(?<=,,) 是一种叫做正向回顾的检查,它会在字符串中找到双逗号后面的内容,因为这个回顾会向后看两个字符,检查里面的模式是否匹配。
(?:,,) 是一种不捕获的括号写法,所以括号中的内容只需要匹配,不会单独提取出来。
\s 或 \s+ 只是为了处理这种特定类型的字符串。
3
[^,{2}] 是一个 字符类,它可以匹配任何字符,除了:',', '{', '2', '}'
通过“字符类”,也叫“字符集合”,你可以告诉正则表达式引擎只匹配
多个字符中的一个。
应该写成 ([^,]{2})+
( group and capture to \1
[^,]{2} any character except: ',' (2 times)
)+ end of \1
从索引1和2中获取匹配的组
([-\w]+)\s+(.*?)\s+,,
这里有一个 在线演示

示例代码:
import re
p = re.compile(ur'([-\w]+)\s+(.*?)\s+,,')
test_str = u"..."
re.findall(p, test_str)
注意:如果空格是可选的,请使用 \s* 而不是 \s+。