将单引号替换为双引号并排除某些元素

2024-04-29

我想用双引号替换字符串中的所有单引号,但出现的情况除外,例如“n't”、“'ll”、“'m”等。

input="the stackoverflow don\'t said, \'hey what\'"
output="the stackoverflow don\'t said, \"hey what\""

代码1:(@https://stackoverflow.com/users/918959/antti-haapala https://stackoverflow.com/users/918959/antti-haapala)

def convert_regex(text): 
     return re.sub(r"(?<!\w)'(?!\w)|(?<!\w)'(?=\w)|(?<=\w)'(?!\w)", '"', text)

有 3 种情况: ' 前面和后面都没有字母数字字符; or 前面不带字母数字字符,但后面带字母数字字符; or 前面有字母数字字符,后面没有字母数字字符。

问题:这不适用于以撇号结尾的单词,即 大多数所有格复数形式,而且它也不适用于非正式场合 以撇号开头的缩写。

代码2:(@https://stackoverflow.com/users/953482/kevin https://stackoverflow.com/users/953482/kevin)

def convert_text_func(s):
    c = "_" #placeholder character. Must NOT appear in the string.
    assert c not in s
    protected = {word: word.replace("'", c) for word in ["don't", "it'll", "I'm"]}
    for k,v in protected.iteritems():
        s = s.replace(k,v)
    s = s.replace("'", '"')
    for k,v in protected.iteritems():
        s = s.replace(v,k)
    return s

太多的单词无法指定,例如如何指定人等。 请帮忙。

Edit 1:我正在使用@anubhava 的精彩答案。我正面临这个问题。有时,该方法会失败的语言翻译。 代码=

text=re.sub(r"(?<!s)'(?!(?:t|ll|e?m|s|d|ve|re|clock)\b)", '"', text)

Problem:

在文本中,“Kumbh melas”melas 是印地语到英语的翻译,而不是复数所有格名词。

Input="Similar to the 'Kumbh melas', celebrated by the banks of the holy rivers of India,"
Output=Similar to the "Kumbh melas', celebrated by the banks of the holy rivers of India,
Expected Output=Similar to the "Kumbh melas", celebrated by the banks of the holy rivers of India,

我正在寻找也许添加一个以某种方式修复它的条件。人为干预是最后的选择。

Edit 2:幼稚而漫长的修复方法:

def replace_translations(text):
    d = enchant.Dict("en_US")
    words=tokenize_words(text)
    punctuations=[x for x in string.punctuation]
    for i,word in enumerate(words):
        print i,word
        if(i!=len(words) and word not in punctuations and d.check(word)==False and words[i+1]=="'"):
            text=text.replace(words[i]+words[i+1],words[i]+"\"")
    return text

有没有我遗漏的极端情况或者有更好的方法吗?


第一次尝试

您还可以使用这个正则表达式:

(?:(?<!\w)'((?:.|\n)+?'?)'(?!\w))

REGEX101 中的演示 https://regex101.com/r/rG6gN0/3

这个正则表达式从开头和结尾匹配带有引号的整个句子/单词,而且还捕获第 1 组内的引用内容,因此您可以将匹配的部分替换为"\1".

  • (?<!\w)- 非单词字符的负向后查找,以排除诸如“you'll”等单词,但允许正则表达式匹配诸如此类的字符之后的引用\n,:,;,. or -,ETC。假设引用前总是有空格是有风险的。
  • '- 单引号,
  • (?:.|\n)+?'?)- 非捕获组:一个或多个任何字符或 新行(以匹配多行句子)与惰性Quantifire(以避免 从第一个到最后一个单引号匹配),然后是 可选的单引号,如果有两个连续的话
  • '(?!\w)- 单引号,后跟非单词字符,以排除 像“i'm”、“you're”等文本,其中引号位于单词之间,

S案

然而,在以 s 结尾的单词之后匹配带有撇号的句子仍然存在问题,例如:'the classes' hours'。我认为在什么时候用正则表达式是无法区分的s其次是'应被视为引用结束,或作为或s带撇号。但我想出了一种解决这个问题的有限方法,使用正则表达式:

(?:(?<!\w)'((?:.|\n)+?'?)(?:(?<!s)'(?!\w)|(?<=s)'(?!([^']|\w'\w)+'(?!\w))))

REGEX101 中的演示 https://regex101.com/r/rG6gN0/8

Python 实现 https://ideone.com/EDD2uD

对于有以下情况的情况有额外的选择s': (?<!s)'(?!\w)|(?<=s)'(?!([^']|\w'\w)+'(?!\w) where:

  • (?<!s)'(?!\w)- 如果没有s before ',与上面的正则表达式匹配(第一次尝试),
  • (?<=s)'(?!([^']|\w'\w)+'(?!\w)- 如果有s before ', 结束一场比赛'仅当没有其他的情况下'后面跟着非单词 以下文本中的字符,位于结尾之前或另一个之前'(但只有'前面有除字母以外的字母s,或打开下一个报价)。这\w'\w就是在这样的匹配中包含一个'位于字母之间,例如i'm, etc.

这个正则表达式应该匹配错误,只有有几个s'连续案例。尽管如此,它还远非完美的解决方案。

\w 的缺陷

另外,使用\w总是有机会'将发生在符号或非之后[a-zA-Z_0-9]但仍然是字母字符,例如某些本地语言字符,然后它将被视为引用的开头。可以通过更换来避免(?<!\w) and (?!\w) with (?<!\p{L}) and (?!\p{L})或者类似的东西(?<=^|[,.?!)\s])等,对引用前句子中可能出现的字符进行正向查找。然而,列表可能会很长。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将单引号替换为双引号并排除某些元素 的相关文章

随机推荐

  • 一段时间后 NSTimer 停止在后台触发

    嘿 我正在开发一个应用程序 其中我必须每 30 秒调用一次 API 所以我为它创建了 NSTimer 但是当我的应用程序进入后台时 计时器会在 3 4 分钟后停止触发 所以它只能在后台运行 3 4 分钟 但之后就不再运行了 我如何修改我的代
  • FBSDK 共享对话框无法在 IOS 11 上运行

    我在用FBSDKShareDialog在 facebook 上分享图片 但在 IOS11 上不起作用 Facebook 共享对话框未打开 我怎样才能分享这篇文章并让它在 IOS11 和以前的版本上也能工作 我以前的工作代码 FBSDKSha
  • 为什么 Box2D 不应该使用像素作为单位?

    手册中说我应该使用小单位 0 1 10米 不鼓励使用像素作为测量单位 但是为什么 Box2D 比我使用小单位时工作得更好 并且具有更好的模拟效果呢 Box2D 是一个模拟框架 内部使用MKS 单位制 http en wikipedia or
  • 如何在刷新期间锁定哈希图?

    我有一个静电HashMap它在应用程序启动时填充 并每天刷新 如何确保刷新期间没有其他线程可以访问地图 ThreadSafe public class MyService private static final Map
  • 检测何时从控制台调用函数的最佳方法

    我想知道检测何时通过控制台直接调用方法或函数的最佳方法 据我目前了解 不可能在相同的函数调用上直接检测到它 但使用 call and apply 函数的方法我可以通过传递附加数据this object 给出以下代码结构 function v
  • 从 Slack 机器人访问 Slack 文件

    我需要一个能够接收和保存从 Slack 聊天室发送的文件的 Slack 机器人 问题是 slack 不发送文件内容 而是发送指向该文件的链接数组 其中大多数 包括下载链接 都是私有的 无法通过机器人访问 它确实发送了一个公共链接 但该链接指
  • 在后台线程加载广告 (adMob)

    我想在后台线程上加载我的添加 因为它使得SlidingMenu打开和关闭时滞后 我应该使用Thread Handler Or AsyncTask String MY AD UNIT ID AdView adView new AdView g
  • 如何取消等待中的任务?

    我正在处理这些 Windows 8 WinRT 任务 并且尝试使用下面的方法取消任务 并且它在某种程度上有效 CancelNotification 方法确实被调用 这使您认为任务已被取消 但在后台任务仍在运行 然后在完成后 任务的状态始终为
  • 列出 AppDomain 中存储的所有自定义数据

    为了存储发生错误时的进程状态 我想列出存储在 AppDomain 中的所有 自定义 数据 通过 SetData LocalStore 属性是私有的 AppDomain 类不可继承 有什么方法可以枚举这些数据吗 AppDomain domai
  • 为什么 Convert.ToDecimal(Double) 舍入为 15 位有效数字?

    我有一个double小数点后17位 即 double myDouble 0 12345678901234567 如果我将其转换为decimal像这样 decimal myDecimal Convert ToDecimal myDouble
  • 如何在codeigniter中从数据库返回最后一条记录?

    我正在尝试获取我拥有数据的最后日期 所以我想打印 date data 列中的最后一个日期 在模型中 public function last record query this gt db gt select LAST date data
  • 无法让 log4net 与 .net windows 服务一起使用

    我有一个 Windows 服务app config and a log4net config app config
  • Qt3D 是 Qt5 的一部分吗?

    我在windows中安装了Qt5库 但Qt助手中没有关于Qt3D的文档 Qt3D 是 Qt5 的一部分还是已从发布版本 5 中删除 是的 Qt 3D 成为标准 Qt 库Qt 5 7 发布 http blog qt io blog 2016
  • 使用 git 客户端和 SVN 存储库的最佳工具/方法

    我已经使用 SVN 大约两年了 主要是通过 TortoiseSVN 和 IntelliJ 并尝试了 git 主要是通过 TortoiseGIT 在这里检测到模式 我们公司正在使用 SVN 作为存储库 他们不会考虑很快进行切换 在本地使用 g
  • 为什么我需要调用new? [复制]

    这个问题在这里已经有答案了 可能的重复 在 C 中什么时候使用 new 什么时候不使用 https stackoverflow com questions 679571 when to use new and when not to in
  • 如何查找用户所属的所有组? (LDAP)

    我正在尝试获取某个用户所属的所有组 我有以下内容结构在LDAP中 o myOrganization ou unit1 cn admin cn guess and ou users cn ann cn bob cn carla myOrgan
  • PHP - 从 HTML 中提取文本、翻译并放回

    我正在使用 API 来翻译我的博客 但它有时会弄乱我的 html 这让我需要更多的工作来修复所有问题 我现在想做的是从 html 中提取内容 翻译它并将其放回原来的位置 我首先尝试使用 preg replace 来执行此操作 其中我将用诸如
  • Django官方针对绝对初学者的教程,绝对失败!

    确实不是那种程度的失败 我刚刚完成了 djangoproject com 的 4 部分教程 我的管理应用程序运行良好 我的入口点 url polls 运行良好 但我得到了以下 http 响应 没有可用的民意调查 即使数据库只有一个注册表 使
  • 当我们在平板电脑上点击外部时如何关闭 Bootstrap 3 下拉菜单?

    我正在这样做 在桌子上效果很好 document on click function dropdown toggle removeClass open 但在 iPad 上它不起作用并且我的下拉菜单仍然打开 您应该使用touchstart a
  • 将单引号替换为双引号并排除某些元素

    我想用双引号替换字符串中的所有单引号 但出现的情况除外 例如 n t ll m 等 input the stackoverflow don t said hey what output the stackoverflow don t sai