【问题标题】:Removing repeated trailing characters from a string in Python从 Python 中的字符串中删除重复的尾随字符
【发布时间】:2022-01-27 11:04:17
【问题描述】:

我有一个带有 cmets 的字段。一些 cmets 只是“否”,但带有不同的尾随“o”。我想对这些 cmets 进行转换,这样我只会得到“否”返回。如何使用正则表达式实现这一点?

例如:

remove_trailing_os("noooooo") 应该输出“no”

remove_trailing_os("nooOOoooooooo") 应该输出“no”

【问题讨论】:

  • @TimBiegeleisen 我不认为这是重复的。链接的问题没有明确提到正则表达式,也没有提到尾随字符或不区分大小写的匹配
  • @mozway 对不起...我以为那些大写的 Os 只是拼写错误。
  • "我如何使用正则表达式来实现这一点?"那么,你对正则表达式了解多少?你能想出一个匹配你想要替换的部分的正则表达式模式吗?你知道你想用什么来代替它吗?你知道如何更换吗? 真正的困难是什么
  • 由于您正在创建函数remove_trailing_os,因此您无需使用正则表达式即可获得结果。使用str.startswith。例如:` if input.startswith("no") return "no"` 如果“no”在不同输入中的大小写不同,则使用re.search(r'^no', input_string, re.I)。它将返回一个匹配对象或返回None

标签: python regex pandas string


【解决方案1】:

您可以使用不区分大小写的反向引用:

import re
re.sub(r'(.)(?i:\1)+$', r'\1', "nooOOoooooooo", re.I)

输出:'no'

正则表达式:

(.)        # match a character
(?i:\1)+$  # match trailing case insensitive repeats of the character

【讨论】:

    【解决方案2】:

    这似乎类似于how can I remove all characters after the second occurrence of a ' ' (space)

    但本质上你想用 o 替换空格。因此

    ## Assuming the two instances
    t = 'noooooo'
    t2 = 'nooOOoooooooo'
    ## Trying them on the two instances
    t[:t.find('o',t.find('o')+1)]
    t2[:t2.find('o',t2.find('o')+1)]
    

    【讨论】:

      【解决方案3】:

      你可以试试加入

      cc = "noooooo"
      cc1= "nooOOoooooooo"
      print(''.join(sorted(set(cc), key=cc.index)))
      print(''.join(sorted(set(cc1.lower()), key=cc1.index)))
      

      会给

      no
      no
      

      你也可以使用 regex

      repeat_pattern = re.compile(r'(\w)\1*', flags=re.IGNORECASE)
      d = repeat_pattern.sub(r"\1", cc)
      d1 = repeat_pattern.sub(r"\1", cc1)
      print(d)
      print(d1)
      

      也会给

      no
      no
      

      【讨论】:

      • 这对cc = "nonoooooo"不起作用
      猜你喜欢
      • 2013-07-29
      • 2011-08-12
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      相关资源
      最近更新 更多