Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python re.sub带反向引用_Python_Regex - Fatal编程技术网

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)