Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python使用正则表达式从字符串中删除最后一个字符_Python_Regex - Fatal编程技术网

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

Python使用正则表达式从字符串中删除最后一个字符,python,regex,Python,Regex,我知道还有很多其他的正则表达式问题,但我希望有人能指出我的正则表达式有什么问题。我已经对它做了一些研究,看起来它应该会起作用。我曾经对它进行过测试,是的,我知道这是ruby的regex,但我使用的规则应该与python在 目前我有 a = ["SDFSD_SFSDF234234","SDFSDF_SDFSDF_234324","TSFSD_SDF_213123"] c = [re.sub(r'[A-Z]+', "", x) for x in a] 返回 ['SDFSD_SFSDF', 'SDF

我知道还有很多其他的正则表达式问题,但我希望有人能指出我的正则表达式有什么问题。我已经对它做了一些研究,看起来它应该会起作用。我曾经对它进行过测试,是的,我知道这是ruby的regex,但我使用的规则应该与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
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib64/python2.6/re.py”,第151行,子文件
返回编译(模式,0).sub(repl,字符串,计数)
文件“/usr/lib64/python2.6/re.py”,第245行,在编译中
raise错误,v#表达式无效
有人能帮我找出我做错了什么吗?

以下错误:

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']
正如你所期望的那样

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

import re
a=[“SDFSD_SFSDF234234”、“SDFSDF_SDFSDF_234324”、“TSFSD_SDF_213123”]
c=[re.match(r'[A-Z_234;]+[A-Z]',x.group()表示A中的x]
打印c
结果:

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

请注意,您在示例中使用的“re.sub”是regex replace命令,而不是搜索。您的正则表达式似乎与您的要求相匹配,而不是与您试图摆脱的东西相匹配以获得您的要求。

您可以在正则表达式中插入“lookahead”。 写为
(?=…)
的regexp将只匹配文本,后跟您在
中输入的内容。
因此,在您的情况下,您可以选择忽略下划线,除非它后面跟着
[A-Z]
。 您的reg exp将如下所示:
r'[A-Z]+(?[A-Z])
因此不后跟字母的下划线将被忽略

不使用正则表达式,使用:

a=[“以下划线结尾”、“不”、“多个”]
b=[x.rstrip(“”)表示a中的x]
打印b
>['以下划线结尾'、'不'、'多个']

它又短又简单。基本上,它说的是“替换所有数字流或前面有一个‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘。
>>> 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']
>>>