有一个报文:
<?xml><root><person><id>123</id></person><person><id>789</id></person></root>
只需要 <id></id>
标签中的的值,例如转换成 123-789
,在 sumlime text 中要怎么替换呢,以下是我写的正则:
<\?xml><root>(<person><id>(\d+)</id></person>)+</root>
替换的时候需要怎么处理呢
![]() | 1 sheeta 2023-04-27 18:58:06 +08:00 $2 |
![]() | 3 AoEiuV020CN 2023-04-27 19:08:35 +08:00 via Android @likefly 举一反三,$1 就能得到 123 了, |
4 jsrunner 2023-04-27 19:08:35 +08:00 ![]() import re xml_str = '<?xml><root><person><id>123</id></person><person><id>789</id></person></root>' # 定义正则表达式模式,匹配 <id> 标签和其中的文本 pattern = re.compile(r'<id>(.*?)</id>') # 使用 findall 方法查找所有匹配项,并返回匹配的文本列表 matches = pattern.findall(xml_str) # 输出匹配的结果 print(matches) # 输出 ['123', '789'] |
![]() | 5 likefly OP @AoEiuV020CN $1 只能取到外面括号的值 |
8 NoOneNoBody 2023-04-27 19:20:54 +08:00 这个需要正则递归,python 内置 re 并不支持,sublimetext 也不能直接完成 所以开个 console 按 #4 的方法手动吧 三方包 regex 支持递归 |
![]() | 9 mohumohu 2023-04-27 19:21:52 +08:00 简单啊,你们就是把问题想复杂了,用什么正则,你直接把<root><person><id>替换成<root>,</id></person><person><id>替换成-,</id></person>替换成空不就好了吗 |
![]() | 10 likefly OP @NoOneNoBody 原来如此,我就是想递归,感谢 |
11 Glauben 2023-04-27 19:25:00 +08:00 这种问题一律建议问 ChatGPT |
![]() | 14 mmnnyycc 2023-04-27 20:15:59 +08:00 (?<=<id>)[^<]+(?=</id>),这个 chatgpt 给的,一秒钟给出,还配合一个了一个 python 的代码 |
![]() | 16 weeei 2023-04-27 20:41:43 +08:00 Regex: (.+)<id>(.+?)</id>(.+?)<id>(.+?)</id>(.+) With: $2 - $4 |
17 Ericcccccccc 2023-04-27 20:44:06 +08:00 这种问题适合问 chatgpt |
![]() | 18 busterian 2023-04-27 20:53:21 +08:00 <id>(.+?)<\/id> <id>$1</id> |
19 mobbdeep 2023-04-27 21:17:58 +08:00 感觉 gpt 要吃掉不少爆栈或者 csdn 的份额啊 |
20 jslang 2023-04-28 09:49:02 +08:00 为什么用正则,这个解析 XML ,然后再拼接啊 |
21 ruke 2023-04-28 10:01:49 +08:00 |
22 ruke 2023-04-28 10:02:25 +08:00 .*?(\d+).*?(\d+).* $1-$2 |
![]() | 23 setsunakute 2023-04-28 13:57:05 +08:00 [^\d]+<id>|</id>[^\d]+ 替换为\n 即可 |
![]() | 24 setsunakute 2023-04-28 13:58:01 +08:00 [^\d]+<id>|</id>[^\d]+ 替换为- |
![]() | 25 ns09005264 2023-04-28 19:39:53 +08:00 rust 里用 captures_iter 倒是可以轻松做到。 ``` let regex = Regex::new(r"<id>(\d+)</id>").unwrap(); let str = "<?xml><root><person><id>123</id></person><person><id>456</id></person><person><id>789</id></person></root>"; let result = regex .captures_iter(str) .map(|cap| cap[1].to_string()) .collect::<Vec<_>>() .join("-"); assert_eq!(result, "123-456-789"); ``` vim 里可以分多步处理 ![]() |
![]() | 26 ns09005264 2023-04-28 19:45:46 +08:00 vim 里分三步,第一步把所有的`<tag>`替换为`-`,第二步把首尾的`-`去掉,第三步把连续的`---`替换为单个`-` ``` :%s/\v(\<.{-}\>)/-/g :%s/\v(^-+|-+$)//g :%s/\v(-+)/-/g ``` |