【发布时间】:2021-06-16 14:59:28
【问题描述】:
我有一个字符串,其中包含多个以逗号分隔的值列表,始终嵌入在 <mks:Field name="MyField"> 和 </mks:Field> 之间。
例如:
<mks:Field name="MyField">X001_ABC</mks:Field><mks:Field name="AnotherField">X002_XYZ</mks:Field><mks:Field name="MyField"></mks:Field><mks:Field name="MyField">X000_Test1,X000_Test2</mks:Field><mks:Field name="MyField">X001_ABC,X000_Test1</mks:Field><mks:Field name="MyField">X000_Test1,X000_Test2,X002_XYZ</mks:Field>
在此示例中,我可以使用以下值:
- X001_ABC
- (空)
- X000_Test1,X000_Test2
- X001_ABC,X000_Test1
- X000_Test1,X000_Test2,X002_XYZ
现在我想删除所有不以前缀“X000_”开头的值,包括任何不必要的逗号,这样我的结果如下所示:
<mks:Field name="MyField"></mks:Field><mks:Field name="AnotherField">X002_XYZ</mks:Field><mks:Field name="MyField"></mks:Field><mks:Field name="MyField">X000_Test1,X000_Test2</mks:Field><mks:Field name="MyField">X000_Test1</mks:Field><mks:Field name="MyField">X000_Test1,X000_Test2</mks:Field>
我尝试了以下正则表达式,但如果只有一个值与我的正则表达式不匹配,并且如果引入了与我的前缀匹配的新值(例如 X000_Test3),我不想更改我的正则表达式,则它不能正常工作。
搜索:(?<=name="MyField">)[^<>](?:.*?(X000_Test1,X000_Test2|X000_Test1|X000_Test2))?.*?(?=</mks:Field>)
替换:\1
这给了我以下与预期输出不匹配的结果:
<mks:Field name="MyField">X000_Test1,X000_Test2</mks:Field><mks:Field name="MyField">X000_Test1</mks:Field><mks:Field name="MyField">X000_Test2</mks:Field>
不幸的是,我不能简单地用其他东西解析字符串 - 在这种情况下,我只能选择正则表达式搜索/替换。
提前感谢您,任何帮助将不胜感激。
【问题讨论】:
-
如果要删除所有不以
X000_开头的值,请尝试regex101.com/r/LNqg9t/1 工具或语言是什么? -
@Thefourthbird 你的正则表达式正是我想要的!不幸的是,该工具在 python 中运行正则表达式(对不起,我现在添加了标签),据我所知,python 不支持 \G 和 \K。关于如何在不访问 python 脚本本身的情况下解决这个问题的任何想法?非常感谢您的支持!
-
你能安装PyPi regex module吗?
标签: python python-3.x regex