Python re.sub带反向引用
我试图在Python re.sub带反向引用,python,regex,Python,Regex,我试图在python中使用re.sub做一些事情,类似于在bash中使用sed所做的事情。我在引用我阅读的组时遇到了问题,这些组是用\g完成的,但我似乎做得不对 我希望消除一组分隔符或分隔符以及行的开头/结尾中的空格: line1 = 'blah < b la a ah > blah' line2 = ' b la a ah > blah' line3 = 'blah < b la a ah ' line1 = re.sub(r"< (.*) (.*) >"
python
中使用re.sub
做一些事情,类似于在bash中使用sed所做的事情。我在引用我阅读的组时遇到了问题,这些组是用\g
完成的,但我似乎做得不对
我希望消除一组分隔符或分隔符以及行的开头/结尾中的空格:
line1 = 'blah < b la a ah > blah'
line2 = ' b la a ah > blah'
line3 = 'blah < b la a ah '
line1 = re.sub(r"< (.*) (.*) >", r"< \g<1>\g<2> >", line1)
line2 = re.sub(r"^ (.*) (.*) >", r" \g<1>\g<2> >", line2)
line3 = re.sub(r"< (.*) (.*) $", r"< \g<1>\g<2> ", line3)
line1='blahblah'
第2行='b la a ah>诸如此类'
第3行='blah”,r“<\g\g>”,第1行)
line2=re.sub(r“^(.*)(.*)>”,r“\g\g>”,第2行)
第3行=re.sub(r“<(.*)(.*)$”,r“<\g\g”,第3行)
如果这是bash,我会这样做:
sed 's/< \(.*\) \(.*\) >/< \1\2 >/g' | sed 's/< \(.*\) \(.*\) $/< \1\2 /g' | sed 's/^ \(.*\) \(.*\) >/ \1\2 >/g'
sed's/<\(.*)\(.*)>/<\1\2>/g'| sed's/<\(.*)\(.*)$/<\1\2/g'| sed's/^(.*)\(.*)>/\1\2>/g'
请看:'blahblah'
在第一个re.sub
中变为blahblah,但之后,最后两个正则表达式都与修改后的字符串不匹配
在开始时需要一个空格,但没有空格。希望有一个最后的空间,但没有
您可以使用一个正则表达式解决方案。regex-r*(?=[^]*>)“
”将匹配任何空格、0或更多出现(\s*
),后面跟任何数量的字符,但第一个
之前的
(带(?=[^]*>)
向前看)
line=re.sub(r“\s*(?=[^]*>)”,“”,第行)
看
结果:blah blah
请注意,不会使用字符,这就是为什么我们只删除与此正则表达式匹配的空格。那就只删除一个吧?看起来很完美!我想我是想把事情搞清楚,但一次完成就更好了。@Stribizev这应该是我相信的解决方案。我在上面贴了一些解释。如果您需要更多详细信息,请告诉我。我仍然有兴趣知道为什么我的反向引用不起作用。您假设我想继续匹配同一行。我的三个表达实际上是针对不同的上下文。解决方案仍然有效。:)在查看代码时,我还可以假设什么公平地说,我本可以给出其他情况。我会更新我希望我把这说得更清楚,但如果不能,请随意修改。我还是个新手。我不确定你想在每一个案例中得到什么。我只是想警告你,你的正则表达式写得很糟糕。您一定听说过回溯:如果正则表达式包含
+
、*
、?
、{1}
或|
,如果量化的子模式失败,它将回溯、检查前面的子模式。在正则表达式中,
也匹配一个空格,因此您的<(.*)(.*)>
需要大量资源才能找到匹配项或使其失败。在Python中,我们没有可变宽度的lookbehind,也没有\G
操作符,我们无法在一个正则表达式中检查左/右上下文。我的解决方案是假设括号是成对的OK。否则,它将失败。
line = re.sub(r"\s*(?=[^<>]*>)", "", line)