python re.sub,只替换部分匹配

时间:2015-09-21 15:06:49

标签: python regex python-2.7

我是python的新手

我需要通过一个正则表达式匹配所有情况并进行替换。这是一个示例子字符串 - >期望的结果:

<cross_sell id="123" sell_type="456"> --> <cross_sell>

我正在尝试在我的代码中执行此操作:

myString = re.sub(r'\<[A-Za-z0-9_]+(\s[A-Za-z0-9_="\s]+)', "", myString)

而不是在<cross_sell之后替换所有内容,它会替换所有内容并返回'>'

有没有办法让re.sub只替换捕获组而不是整个模式?

4 个答案:

答案 0 :(得分:9)

您可以使用替换组:

>>> my_string = '<cross_sell id="123" sell_type="456"> --> <cross_sell>'
>>> re.sub(r'(\<[A-Za-z0-9_]+)(\s[A-Za-z0-9_="\s]+)', r"\1", my_string)
'<cross_sell> --> <cross_sell>'

注意我将第一组(您要保留的组)放在括号中,然后通过在替换字符串中使用"\1"修饰符(第一组)将其保留在输出中。

答案 1 :(得分:3)

您可以使用组引用来匹配第一个单词和否定字符类,以匹配<>之间的其余字符串:

>>> s='<cross_sell id="123" sell_type="456">'
>>> re.sub(r'(\w+)[^>]+',r'\1',s)
'<cross_sell>'

\w等于[A-Za-z0-9_]

答案 2 :(得分:1)

由于输入数据是XML,因此最好使用 XML解析器解析它。

内置xml.etree.ElementTree是一个选项:

>>> import xml.etree.ElementTree as ET
>>> data = '<cross_sell id="123" sell_type="456"></cross_sell>'
>>> cross_sell = ET.fromstring(data)
>>> cross_sell.attrib = {}
>>> ET.tostring(cross_sell)
'<cross_sell />'

lxml.etree是另一种选择。

答案 3 :(得分:0)

在python 3.6下测试的代码下面,没有使用组..

test = '<cross_sell id="123" sell_type="456">'
resp = re.sub(r'\w+="\w+"' ,r'',test)
print (resp)

<cross_sell>