如何摆脱字符串开头或结尾的非字母数字字符

时间:2014-03-26 02:40:53

标签: python list python-3.x character

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

实施例

'cats--'

我想摆脱 -

我试过了:

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

那不起作用。任何建议。

5 个答案:

答案 0 :(得分:8)

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)

答案 1 :(得分:1)

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

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

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

print text

答案 2 :(得分:0)

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

  • 正则表达式
  • 替换
  • 字符串

<强>代码:

import re

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

print output

<强>解释

  • 部分"\\w"匹配任何字母数字字符。
  • [^x]将匹配 x
  • 的任何字符

答案 3 :(得分:0)

通过使用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']

这个与你得到的结果完全相同(截至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']

答案 4 :(得分:0)

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

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

或者,如果也要删除_,请将\W包装到字符类中,然后在其中添加_

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

请参见regex demoregex graph

enter image description here

请参见Python demo

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