【问题标题】:Regex to remove specific words in python正则表达式删除python中的特定单词
【发布时间】:2016-03-30 14:30:37
【问题描述】:

我想在 python 中使用正则表达式进行一些操作。

所以输入是+1223,+12_remove_me,+222,+2223_remove_me 和 输出应该是+1223,+222

输出应该只包含逗号分隔的单词,不包含_remove_me,并且每个单词之间只有一个逗号。

注意:我尝试了\+([0-9|+]*)_\+([0-9|+]*) 和其他一些我没有得到所需输出的组合。

注意 2 我不能使用循环,只需要在没有循环的情况下使用正则表达式。

【问题讨论】:

  • 只是好奇,请问你为什么用regex而不是re
  • 也许是r',?\+\d+(?:_[^_,]+)+',或者只是,?\+\d+_[^,]+
  • 检查this demo
  • @WiktorStribiżew 我们需要删除,之间的空格
  • 什么空间?结果是+1223,+222

标签: python regex python-2.7


【解决方案1】:

您的正则表达式似乎不完整,但您在正确的轨道上。请注意,字符类中的管道符号被视为文字,您的 [0-9|+] 匹配数字或 |+ 符号。

你可以使用

,?\+\d+_[^,]+

regex demo

解释:

  • ,? - 可选,(如果“单词”在字符串的开头,它应该是可选的)
  • \+ - 文字 +
  • \d+ - 1 位以上
  • _ - 文字下划线
  • [^,]+ - 除, 之外的 1+ 个字符

Python demo:

import re
p = re.compile(r',?\+\d+_[^,]+')
test_str = "+1223,+12_remove_me,+222,+2223_remove_me"
result = p.sub("", test_str)
print(result)
# => +1223,+222

【讨论】:

  • 如果 '_remove_me' 之前没有数字,这不会中断吗?也不会留下逗号吗?见ideone.com/RINN5W
  • @TomRees:根据样本 OP 输入判断,没有前导逗号,也没有没有前导数字的条目。没有确切的要求,我是从 OP 尝试的模式中推断出来的。实际上,删除前导和尾随逗号很容易:r',+$|^,+'(需要第二步,或者更长的表达式以及替代方案)。至于数字,* 量词可以用在\d 之后:,?\+\d*_[^,]+
  • 同意 - 让我 +1。只是想我会指出它以防 OP 示例不完整。
  • 啊,是的,在 Python 中使用strip 删除前导/尾随字符很容易。但是,OP 需要一个正则表达式。让我们听听 OP 的声音。
  • @WiktorStribiżew 但输入为+12_remove_me,+222,+2223_remove_me时输出错误
【解决方案2】:

非正则表达式方法将涉及使用str.split() 并排除以_remove_me 结尾的项目:

>>> s = "+1223,+12_remove_me,+222,+2223_remove_me"
>>> items = [item for item in s.split(",") if not item.endswith("_remove_me")]
>>> items
['+1223', '+222']

或者,如果_remove_me 可以出现在每个项目内的任何位置,请使用not in

>>> items = [item for item in s.split(",") if "_remove_me" not in item]
>>> items
['+1223', '+222']

然后您可以使用str.join() 再次将项目连接成一个字符串:

>>> ",".join(items)
'+1223,+222'

【讨论】:

  • 我们不能使用循环,只需要使用正则表达式即可。
  • @Pramod hm,您能详细说明原因吗?
  • @alexce 因为我的内部编译系统仅支持基于正则表达式的操作。
【解决方案3】:

在您的情况下,您需要正则表达式进行协商

[^(_remove_me)]

Demo

【讨论】:

    【解决方案4】:

    您可以在没有正则表达式的情况下执行此操作,只需使用字符串操作即可。以下内容可以写成单行,但为了便于阅读,已进行了扩展。

    my_string = '+1223,+12_remove_me,+222,+2223_remove_me' #define string
    my_list = my_string.split(',')                         #create a list of words
    my_list = [word for word in my_list if '_remove_me' not in word] #stop here if you want a list of words
    output_string = ','.join(my_list)
    

    【讨论】:

    • 我根本不能使用循环,我需要做的不仅仅是使用正则表达式。
    猜你喜欢
    • 2021-04-20
    • 2021-04-20
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 2013-06-10
    • 2022-07-14
    • 2013-12-15
    • 1970-01-01
    相关资源
    最近更新 更多