【问题标题】:Using Regex to replace double quotes in the middle of a word使用正则表达式替换单词中间的双引号
【发布时间】:2018-09-29 16:45:47
【问题描述】:

我有一个如下所示的字符串:

my_string='''[u"column1" : u"abcd", u"column2" : u"te"st"]'''

我想替换单词中间的双引号(通过单引号),而不更改开头或结尾的双引号。这意味着我希望my_string 是这样的:

'''[u"column1" : u"abcd", u"column2" : u"te'st"]'''

现在,我只是使用一种变通解决方案来做到这一点。基本上,如果单词前面没有字母 u,我的解决方案会替换单词中间的双引号。这是它的样子:

unusual=re.findall(r'([a-tv-zA-TV-Z0-9]\"[a-zA-Z0-9])', my_string)
if unusual:
  for un in unusual:
    my_string=my_string.replace(un, un.replace('"', "'"))

现在这对我有用,但改进这个解决方案会很有趣,因为如果我在双引号旁边的单词中间有一个u,它将不再起作用。例如:my_string='''[u"column1" : u"abcd", u"column2" : u"teu"st"]'''

我能得到一些帮助吗?我的想法不多了:)

PS:我正在使用python 2.7

【问题讨论】:

  • 我担心信息被破坏了......你必须在这里应用一些启发式,或者修复上游的问题。
  • 可以跳过以下格式<space>u"

标签: python regex python-2.7


【解决方案1】:

您可以尝试使用环视(不是 100% 完美):

(?<=\w)(?<![\[\s:]u)"(?=\w)

并将这些出现替换为',请参阅a demo on regex101.com


分解,这说:
(?<=\w)       # require a word character immediately before
(?<![\[\s:]u) # no [u nor :u nor  u (with spaces)
"             # a double quote
(?=\w)        # require a word character afterwards.


Python:
import re

my_string='''[u"column1" : u"abcd", u"column2" : u"te"st"]'''
rx = re.compile(r'(?<=\w)(?<![\[\s:]u)"(?=\w)')

new_string = rx.sub("'", my_string)
print(new_string)
# [u"column1" : u"abcd", u"column2" : u"te'st"]

更好的是:修复它的来源。

【讨论】:

    【解决方案2】:
    >>> my_string='''[u"column1" : u"abcd", u"column2" : u"te"st"]'''
    
    >>> print(re.sub(r'("\w+)(")(\w+")', r"\1'\3", my_string))
    [u"column1" : u"abcd", u"column2" : u"te'st"]
    

    说明:

    ("\w+) 将匹配任何以引号 " 开头的单词,括号用于表示组 即在您的情况下它将匹配 "te(第 1 组)

    (") 将匹配单词后的任何现有引号 即在您的情况下,它将在 "te 之后匹配 "(第 2 组)

    (\w+") 将匹配任何以引号 " 结尾的单词 即在您的情况下它将匹配 st"(第 3 组)

    re.sub()中,我们可以直接表示组以防止匹配

    \1 将保持("\w+) 匹配的所有字符不变

    \3 将保持(\w+") 匹配的所有字符不变

    \2 代表两个匹配组之间的引用 " 因此我们可以写任何字符来替换组 2

    【讨论】:

      【解决方案3】:

      注意字符串和您选择的方法来完成预期任务。您可以搜索:

      "(?<![[ :]u.)(?=[a-zA-Z\d])
      

      并替换为'

      Live demo

      如果您将_ 视为正则表达式上方的单词字符可能会更短:

      "(?<![[ :]u.)(?=\w)
      

      细分:

      • "匹配双引号
      • (?&lt;![[ :]u.) 前面没有分隔符:、空格或[
      • (?=\w) 并且后面是一个单词字符

      Python 代码:

      re.sub(r'"(?<![[ :]u.)(?=\w)', "'", my_string)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-12
        • 2021-09-23
        • 2016-10-14
        • 1970-01-01
        • 2020-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多