首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python re.sub,只替换部分匹配。

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

Stack Overflow用户
提问于 2015-09-21 15:06:49
回答 4查看 21K关注 0票数 18

我对蟒蛇很陌生

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

代码语言:javascript
复制
<cross_sell id="123" sell_type="456"> --> <cross_sell>

我试图在我的代码中这样做:

代码语言:javascript
复制
myString = re.sub(r'\<[A-Za-z0-9_]+(\s[A-Za-z0-9_="\s]+)', "", myString)

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

是否有一种方法可以让re.sub只替换捕获组而不是整个模式?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-09-21 15:11:06

您可以使用替换组:

代码语言:javascript
复制
>>> 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"修饰符(第一组)将其保存在输出中。

票数 27
EN

Stack Overflow用户

发布于 2015-09-21 15:11:03

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

代码语言:javascript
复制
>>> s='<cross_sell id="123" sell_type="456">'
>>> re.sub(r'(\w+)[^>]+',r'\1',s)
'<cross_sell>'

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

票数 3
EN

Stack Overflow用户

发布于 2015-09-21 15:24:29

由于输入数据是XML,所以最好用XML解析器解析它。

内置xml.etree.ElementTree是一种选择:

代码语言:javascript
复制
>>> 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是另一种选择。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32698614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档