【问题标题】:Python3 regex not changing \" to "Python3 正则表达式不会将 \" 更改为 "
【发布时间】:2018-03-30 23:03:08
【问题描述】:

我有一个 json 文件,里面装满了用户 cmets(来自网络抓取),我用 pandas 将其拉入了 python

import pandas as pd

data = pd.DataFrame(pd.read_json(filename, orient=columnName,encoding="utf-8"),columns=columnName)
data['full_text'] = data['full_text'].replace('^@ABC(\\u2019s)*[ ,\n]*', '', regex=True)
data['full_text'] = data['full_text'].replace('(\\u2019)', "'", regex=True)
data.to_json('new_abc_short.json',orient='records')

这些消息与在线的相应消息不完全匹配。 (表情符号显示为 \u0234 或其他内容,撇号为 \u2019,链接中的正斜杠,引号有反斜杠。

我想清理它们,所以我学习了一些正则表达式,所以我可以拉入 python,清理它们,然后以不同的名称将它们重新保存回 json(现在)(https://docs.python.org/3/howto/regex.html)

第二行有助于删除 twitter 句柄(如果它只存在于开头),然后删除 's 如果它被使用(例如 @ABC's )。如果开头没有 twitter 句柄(可能在消息中间使用),则保留该句柄。然后它会删除所有留下的空格和逗号(同样仅在字符串的开头) 例如“@ABC,你好”变成“你好”。 “嗨@ABC”保持不变。 “@ABC 的推特很大”会变成“推特很大”

第三行有助于替换所有无法显示的撇号(例如,don\u2019t 变回 don't)

我有数千条记录(并非所有记录都存在撇号、引号、链接等问题),根据我看过的非常小的示例,它们似乎有效

但我的第三个不起作用:

data['full_text'] = data['full_text'].replace('\\"', '"', regex=True) 

json 中的示例消息:"full_text":"@ABC 你怎么能\"意外关闭\"我的帐户"

我想删除双引号旁边的 \,使它看起来像真正的消息(我假设它是用户显然没有输入的转义字符)

但无论我做什么,我都无法删除它

从我的正则表达式学习中,“不是元字符。所以反斜杠甚至不应该存在。但无论如何,我已经尝试过:

\\" (which i think should be the obvious one, i have \", no special quirk in " but there is in \ so i need another back slash to escape that)
\\\\" (some forums posts online mention needing 4 slashes
\\\" ( i think someone mention in the forum posts that they got it workin with 3) 
\\\(\")  (i know that brackets provide groupings so i tried different combinations)
(\\\\")

上面的所有表达式我都用单引号括起来,但它们不起作用。我想也许双引号是问题,因为我只有一个,所以我用单引号 x3 替换了单引号

'''\\"'''

但以上都不适用于三单引号

我一直在重新检查新保存的 json 并且一直看到:

"full_text":"你怎么能\"不小心关闭\"我的账户" (即用空格删除@ABC,但不是反斜杠位)

最初,我尝试研究转换这些 un​​icode 问题,即使用 encoding="utf-8") 虽然我在这方面的经验有限并且一直失败,所以正则表达式是我最好的选择

【问题讨论】:

  • 这样做几乎可以肯定是错误的方法。更好的是找到额外级别的转义,并使用相同的工具来取消转义字符串。
  • @DanielH 如果你所说的工具是指什么提供了数据然后保存到 json 中,那么那将是通过抓取 Twitter 吗?所以我想我真的不能从 Twitter 方面做任何事情?
  • 等等...当你说print(data['full_text'])时你会得到什么?

标签: python json regex python-3.x pandas


【解决方案1】:

哦,我错过了 pandas 的提示,所以 pandas 替换 确实 使用正则表达式。但是,需要明确的是,str.replace 不适用于正则表达式。 re.sub 会。

现在

  • 要匹配单个反斜杠,您的正则表达式为:"\\"
  • 描述该正则表达式的字符串:"\\\\"
  • 使用原始字符串时,双反斜杠就足够了:r'\\'

如果您的字符串真的" 之前包含\,则可以使用正则表达式:

\\(?=\")

它为您的" 进行了前瞻(查看regex101)。

你必须使用类似的东西:

re.sub(r'\\(?=\")',"",s,0)

或使用该正则表达式的 pandas 等效项。

【讨论】:

  • 我使用的原始json(在我将它加载到python之前),如果我在notepad ++中打开它,找到那条推文,我会在引号之前看到退格(我检查了一些不同的推文,他们都遇到同样的问题)。我不太确定我是否理解 \(?=\"),我用它替换了我的表达式(用单引号括起来)尽管编译器抱怨位置 5 的括号不平衡?(有点愚蠢,但如果我很重要,我在前面的'r'中也添加了。如果修复了错误,但是当我检查新的json时,反斜杠仍然存在:(
  • 如果我理解正确的表达式 \(?=\"),从我的链接,你的匹配(基于第一个也是唯一的 \" 实例的 (?=...) . 虽然,除了删除第二个 \ 的怪癖之外,我不确定两个 \\ 如何做任何事情,导致表达式搜索 \\"。我还注意到外部的反斜杠数量似乎可以控制那个括号错误
  • 我什至尝试使用 re.sub 作为匿名函数,但它没有工作:( data['full_text'] = data['full_text'].apply(lambda x: re.sub(r '\(?=\")','"',x))
  • 我运行了这个,看起来问题不是正则表达式!!!! print(data['full_text'].loc[data['id_str'] == 791046066464358200])
  • 问题似乎来自我的最后一行 data.to_json('new_abc_short.json',orient='records')..... 我删除了反斜杠,to_json 重新引入了它。虽然仍然不确定如何解决这个问题,除非我正在寻找一个特定的标志
猜你喜欢
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2020-10-10
  • 2013-09-09
  • 1970-01-01
  • 2018-01-29
相关资源
最近更新 更多