3

我知道还有很多其他的正则表达式问题,但我希望有人能指出我的正则表达式有什么问题。我已经对它进行了一些研究,看起来它应该可以工作。我使用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

谁能帮我弄清楚我做错了什么?

4

5 回答 5

2
>>> 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']
>>>

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

于 2013-07-17T22:50:24.523 回答
2
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”是正则表达式替换命令,而不是搜索。您的正则表达式似乎与您所要求的内容相匹配,而不是您试图摆脱的内容以获得您所要求的内容。

于 2013-07-17T22:04:49.563 回答
2

不使用正则表达式rstrip

a = ["ends_with_underscore_", "does_not", "multiple_____"]
b = [ x.rstrip("_") for x in a]
print b
>> ['ends_with_underscore', 'does_not', 'multiple']
于 2013-07-17T22:25:51.480 回答
1
于 2013-07-17T22:15:47.453 回答
1

中的错误:

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']

它可以按您的预期工作。

另一件事,$是用来引爆行尾的,所以它可能不应该是第一个字符。

于 2013-07-17T22:02:40.303 回答