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

2024-10-01 12:28:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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只替换捕获组而不是整个模式?


Tags: 字符串代码gtreid示例内容type
3条回答

可以使用替换组:

>>> 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"修饰符(第一个组)将其保留在输出中。

因为输入数据是XML,所以最好使用XML解析器来解析它。

内置^{}是一个选项:

>>> 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 />'

^{}是另一个选项。

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

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

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

相关问题 更多 >