【问题标题】:Trying to convert plural words to singular words using regex but want to ignore a few words尝试使用正则表达式将复数单词转换为单数单词但想忽略一些单词
【发布时间】:2022-01-08 00:58:19
【问题描述】:

我目前正在尝试替换一些复数词,例如从“birds”中删除“s”并在 bigquery 中将其替换为“bird”

但我希望他们忽略“less”、“james”、“this”等几个词。

我能够想出这个忽略“少”但仍然屠夫詹姆斯的方法。

    SELECT REGEXP_REPLACE("James likes to chase birds","([^s])s\\b", "\\1" )

我得到的输出是“詹姆斯喜欢追逐鸟”,但我期待的是“詹姆斯喜欢追逐鸟”

更新: 我尝试使用负前瞻,但不幸的是,Bigquery Regex(RE2) 不支持此功能。

【问题讨论】:

  • 当你说“像“less”、“james”、“this””这样的词时,你的意思是要避免在一个结尾匹配s如果最后一个s 前面有ies,那么单词?那你需要"([^\\W\\d_ies])s\\b"
  • 感谢@WiktorStribiżew,但不是真的,假设我有“游戏”,我只想去掉“s”以获得其单数形式“游戏”。如果可能的话,我不介意在正则表达式中忽略这些词,不知道如何在没有负面前瞻性的情况下做到这一点

标签: regex google-bigquery stemming re2


【解决方案1】:

您可以在此处使用替代方法,即带有两种替代方法的正则表达式。在第一种选择中,您可以将所有例外的单词捕获到第 1 组中,在第二种选择中,使用您的正则表达式。替换将连接两个组值:

(?i)\b(less|james|this)\b|([^s])s\b

替换为\1\2。请参阅regex demo详情

  • (?i) - 不区分大小写的修饰符
  • \b(less|james|this)\b - 第 1 组:lessjamesthis 作为一个整体
  • | - 或
  • ([^s]) - 第 1 组:s 以外的任何字符(注意:如果您只想匹配 s 以外的字母,可以使用 [^\W\d_s]
  • s\b - s 在词尾。

在您的代码中,使用

SELECT REGEXP_REPLACE("James likes to chase birds", r"(?i)\b(less|james|this)\b|([^s])s\b", r"\1\2" )

【讨论】:

  • 是的!这正是我一直在寻找的,我不知道我可以同时使用两个捕获组,而且始终只有一个在场。非常感谢!
猜你喜欢
  • 2013-06-16
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 2011-05-30
相关资源
最近更新 更多