使用正则表达式替换单词

时间:2018-04-19 08:49:41

标签: python regex python-2.7

我有一个看起来像这样的字符串:

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

3 个答案:

答案 0 :(得分: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"]

更好的是:修改它来自的字符串。

答案 1 :(得分:1)

>>> 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

答案 2 :(得分:1)

照顾字符串以及您选择的方法来达到预期的任务。你可以去寻找:

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

并替换为'

Live demo

如果您将_视为单词字符,则regex可能会更短:

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

故障:

  • "匹配双引号
  • (?<![[ :]u.)之前没有分隔符:,空格或[
  • (?=\w)后跟一个单词字符

Python代码:

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