python 如何删除字符串开头或结尾的非字母数字字符

ztyzrc3y  于 2023-02-18  发布在  Python
关注(0)|答案(5)|浏览(405)

我有一个列表,其中的元素在每个字符串的开头或结尾都有不必要的(非字母数字)字符。
前。

'cats--'

我想摆脱-
我试过:

for i in thelist:
    newlist.append(i.strip('\W'))

那没用,有什么建议吗.

cetgtptt

cetgtptt1#

def strip_nonalnum(word):
    if not word:
        return word  # nothing to strip
    for start, c in enumerate(word):
        if c.isalnum():
            break
    for end, c in enumerate(word[::-1]):
        if c.isalnum():
            break
    return word[start:len(word) - end]

print([strip_nonalnum(s) for s in thelist])

或者

import re

def strip_nonalnum_re(word):
    return re.sub(r"^\W+|\W+$", "", word)
yptwkmov

yptwkmov2#

要从两端删除除字母、数字和_以外的一个或多个字符,可以使用

re.sub(r'^\W+|\W+$', '', '??cats--') # => cats

或者,如果也要删除_,则将\W Package 到字符类中,并在其中添加_

re.sub(r'^[\W_]+|[\W_]+$', '', '_??cats--_')

请参见regex demo和正则表达式图:

请参见Python demo

import re
print( re.sub(r'^\W+|\W+$', '', '??cats--') )          # => cats
print( re.sub(r'^[\W_]+|[\W_]+$', '', '_??cats--_') )  # => cats
osh3o9ms

osh3o9ms3#

可以使用正则表达式。方法re.sub()将接受三个参数:

  • 正则表达式
  • 该替代品
  • 该字符串
    • 代码:**
import re

s = 'cats--'
output = re.sub("[^\\w]", "", s)

print output
    • 说明:**
  • 部件"\\w"匹配任何字母数字字符。
  • [^x]将匹配 * 不是 * x的任何字符
pod7payv

pod7payv4#

我相信这是最短的非正则表达式解决方案:

text = "`23`12foo--=+"

while len(text) > 0 and not text[0].isalnum():
    text = text[1:]
while len(text) > 0 and not text[-1].isalnum():
    text = text[:-1]

print text
5rgfhyps

5rgfhyps5#

使用strip时,你必须知道要剥离的子字符串。

>>> 'cats--'.strip('-')
'cats'

你可以使用re来去掉非字母数字字符,但是你会在鼠标IMO上用大炮射击。使用str.isalpha()你可以测试任何字符串是否包含字母字符,所以你只需要保留那些:

>>> ''.join(char for char in '#!cats-%' if char.isalpha())
'cats'
>>> thelist = ['cats5--', '#!cats-%', '--the#!cats-%', '--5cats-%', '--5!cats-%']
>>> [''.join(c for c in e if c.isalpha()) for e in thelist]
['cats', 'cats', 'thecats', 'cats', 'cats']

你想去掉非字母数字,这样我们就可以做得更好:

>>> [''.join(c for c in e if c.isalnum()) for e in thelist]
['cats5', 'cats', 'thecats', '5cats', '5cats']

这个结果与使用re得到的结果完全相同(从Christian's answer开始):

>>> import re
>>> [re.sub("[^\\w]", "", e) for e in thelist]
['cats5', 'cats', 'thecats', '5cats', '5cats']

但是,如果您只想从字符串末尾去除非字母数字字符,则应使用另一种模式,如下面所示(选中re Documentation):

>>> [''.join(re.search('^\W*(.+)(?!\W*$)(.)', e).groups()) for e in thelist]
['cats5', 'cats', 'the#!cats', '5cats', '5!cats']

相关问题