我对蟒蛇很陌生
我需要用一个正则表达式来匹配所有的情况,并做一个替换。这是一个示例子字符串->期望的结果:
<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只替换捕获组而不是整个模式?
发布于 2015-09-21 15:11:06
您可以使用替换组:
>>> 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"修饰符(第一组)将其保存在输出中。
发布于 2015-09-21 15:11:03
您可以使用组引用来匹配第一个单词,并使用一个否定式字符类来匹配<>之间字符串的其余部分:
>>> s='<cross_sell id="123" sell_type="456">'
>>> re.sub(r'(\w+)[^>]+',r'\1',s)
'<cross_sell>'\w等于[A-Za-z0-9_]。
发布于 2015-09-21 15:24:29
由于输入数据是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是另一种选择。
https://stackoverflow.com/questions/32698614
复制相似问题