繁体   English   中英

Python使用正则表达式从字符串中删除最后一个字符_

[英]Python Removing last character _ from string using regex

我知道还有很多其他正则表达式问题,但我希望有人能指出我的正则表达式有什么问题。 我已经对其进行了一些研究,看起来它应该可以工作。 我用rubular进行了测试,是的,我知道这是ruby的正则表达式,但是我使用的相同规则应该从python文档中的外观上应用于python

目前我有

a = ["SDFSD_SFSDF234234","SDFSDF_SDFSDF_234324","TSFSD_SDF_213123"]
c = [re.sub(r'[A-Z]+', "", x) for x in a]

哪个返回

['SDFSD_SFSDF', 'SDFSDF_SDFSDF_', 'TSFSD_SDF_']

但我要它回来

['SDFSD_SFSDF', 'SDFSDF_SDFSDF', 'TSFSD_SDF']

我尝试使用此正则表达式

c = [re.sub(r'$?_[^A-Z_]+', "", x) for x in a]

但我收到此错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.6/re.py", line 151, in sub
    return _compile(pattern, 0).sub(repl, string, count)
  File "/usr/lib64/python2.6/re.py", line 245, in _compile
    raise error, v # invalid expression

谁能帮助我找出我做错了什么?

import re

a = ["SDFSD_SFSDF234234","SDFSDF_SDFSDF_234324","TSFSD_SDF_213123"]
c = [re.match(r'[A-Z_]+[A-Z]', x).group() for x in a]

print c

结果:

['SDFSD_SFSDF', 'SDFSDF_SDFSDF', 'TSFSD_SDF']

请注意,您在示例中使用的“ re.sub”是一个正则表达式替换命令,而不是搜索。 您的正则表达式似乎与您要的内容相匹配,而不是您想要摆脱的内容。

您可以在正则表达式中插入“ lookahead”。 输入为(?=...)您的正则表达式将仅匹配文本,后跟您在 因此,根据您的情况,您可以选择忽略下划线,除非后跟[AZ] 您的reg exp将如下所示: r'[AZ]+_(?[AZ])'因此下划线而不是字母将被忽略。

没有使用rstrip正则表达式:

a = ["ends_with_underscore_", "does_not", "multiple_____"]
b = [ x.rstrip("_") for x in a]
print b
>> ['ends_with_underscore', 'does_not', 'multiple']
>>> import re
>>> a = ["SDFSD_SFSDF234234","SDFSDF_SDFSDF_234324","TSFSD_SDF_213123"]
>>> c = [re.sub('_?\d+','',x) for x in a]
>>> c
['SDFSD_SFSDF', 'SDFSDF_SDFSDF', 'TSFSD_SDF']
>>>

简短而简单。 基本上,这是说“替换所有以数字流或以_开头的数字流”。

错误在:

c = [re.sub(r'$?_[^A-Z_]+', "", x) for x in a]

是由引起的? ,它前面没有任何字符,因此不知道该匹配0或1次。 如果将其更改为:

>>> [re.sub(r'_?[^A-Z_]+$', "", x) for x in a]
['SDFSD_SFSDF', 'SDFSDF_SDFSDF', 'TSFSD_SDF']

它按您的预期工作。

另一件事, $用于引爆行尾,因此它可能不应该是第一个字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM