我有一个看起来像这样的字符串:
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
答案 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])
并替换为'
。
如果您将_
视为单词字符,则regex可能会更短:
"(?<![[ :]u.)(?=\w)
故障:
"
匹配双引号(?<![[ :]u.)
之前没有分隔符:
,空格或[
(?=\w)
后跟一个单词字符Python代码:
re.sub(r'"(?<![[ :]u.)(?=\w)', "'", my_string)