繁体   English   中英

Python 正则表达式 - 用字符替换组

[英]Python regex - replace group with character

我试图找到用 python 中的字符替换特定模式的最佳方法。

例如,如果我有文本“prop1”:“val1”,“prop2”:“val2”“abcdefg”:“hijklmn”“1234”:“5678”

但我想要字符串:“prop1”:“val1”,“prop2”:“val2”,“abcdefg”:“hijklmn”,“1234”:“5678”

我发现这种模式似乎从 regex101 正确地对引号集之间的空间进行分组

'"\S*"(\s{1})"\S*"'

在此处输入图像描述

但是当在 python 中使用它时,这似乎不是替换组而是替换整个匹配或其他一些变体行为。

代码:

testStr = 'prop1": "val1","prop2": "val2" "abcdefg": "hijklmn" "1234": "5678'
testMatch = re.search('"\S*"(\s{1})"\S*"', testStr)
print(f'Full match: {testMatch.group(0)}')
testGroupMatch = testMatch.group(1)
print(f'Group match: {testGroupMatch}')

print(f'Test string before replace: {testStr}')
testStrReplaced = re.sub('"\S*"(\s{1})"\S*"', ',', testStr)
print(f'Test string after replace: {testStrReplaced}')

Output:

Full match: "val2" "abcdefg"
Group match:  
Test string before replace: prop1": "val1","prop2": "val2" "abcdefg": "hijklmn" "1234": "5678"
Test string after replace: prop1": "val1","prop2": ,: ,: "5678"

有谁知道这是否是这种情况的正确方法? 如果是这样,正则表达式看起来是否正确以针对我要替换的模式?

有谁知道我将如何替换匹配组? 我发现的大多数示例都提到了反向引用组,但是,这似乎是如果我想用我已经匹配的组替换某些东西。 在这种情况下,我只想替换匹配的组,从我的测试 output 中,它只是空格,只有一个字符,比如逗号。

谢谢!

试试这个正则表达式:

("[^"]+"\s*:\s*"[^"]+")\s

用第 1 组的内容替换每个匹配项,后跟 a ,\1,

点击演示

代码


解释:

  • ("[^"]+"\s*:\s*"[^"]+") - 匹配格式为"key":"value"的子字符串并在第 1 组中捕获它
    • "[^"]+" - 匹配一个"后跟 1 次或多次出现的任何不是"后跟结束"的字符
    • \s* - 匹配 0 或出现的空格
    • : - 匹配一个:
    • \s* - 匹配 0 或出现的空格
    • "[^"]+" - 匹配一个"后跟 1 次或多次出现的任何不是"后跟结束"的字符
  • \s - 匹配迄今为止匹配的任何内容之后的空格。 这个空白最终将被替换为,

因此,您想要的是找到键和值(以"...": "..."的形式),如果没有逗号,则在其后添加一个逗号(最后一个键和值组除外)。

您可以将(".*?"\s*:\s*".*?")\s*,?(?!$)替换为\1,

这个想法是找出"key": "value"后跟可选逗号的模式,并用"key": "value",

演示: https://regex101.com/r/OX6HH0/1

(".*?"\s*:\s*".*?")\s*,?(?!$)
(                                start of group 1
 "                               double quote
  .*?                            reluctant match of any number of any char
                                   (i.e. match as least char as 
                                   possible)
     "                           double quote 
      \s*                        any number of space
         :                       colon
          \s*                    any number of space
             ".*?"               similar to key part: double quote, followed
                                   by reluctant match of any char, followed
                                   by double quote
                  )              end of group 1
                   \s*,?         followed by any space, with optional comma
                        (?!$)    negative lookahead: not followed by end of
                                   line (i.e. do not match if it is the last
                                   key-and-value)

并将上面的匹配替换为 group1,后跟逗号

正则表达式旨在查找特定文本,当您捕获匹配的一部分时,您通常希望获取(或在替换时保留)该部分。

您的方法在很多情况下都不起作用,我建议匹配"...":"..."的所有情况,然后用逗号简单地加入。

请参阅Python 演示

import re
text = r'"prop1": "val1","prop2": "va\" l2" "abcdefg": "h ij kl mn""1234": "5678"'
rx = r'"[^"\\]*(?:\\.[^"\\]*)*"\s*:\s*"[^"\\]*(?:\\.[^"\\]*)*"'
print( ', '.join(re.findall(rx, text, re.S)) )
# => "prop1": "val1", "prop2": "va\" l2", "abcdefg": "h ij kl mn", "1234": "5678"

正则表达式是

"[^"\\]*(?:\\.[^"\\]*)*"\s*:\s*"[^"\\]*(?:\\.[^"\\]*)*"

请参阅正则表达式演示 详情

  • "[^"\\]*(?:\\.[^"\\]*)*" - 一个" ,除"\之外的零个或多个字符,然后出现零个或多个任何转义字符,然后为零或除"\之外的更多字符,然后是"字符(两个双引号之间的字符串,其中可以包含任何转义序列)
  • \s*:\s* - 用任何零个或多个空格括起来的冒号
  • "[^"\\]*(?:\\.[^"\\]*)*" - 见上文。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM