我有一个列表,其中的元素在每个字符串的开头或结尾都有不必要的(非字母数字)字符。
实施例
'cats--'
我想摆脱 -
我试过了:
for i in thelist:
newlist.append(i.strip('\W'))
那不起作用。任何建议。
答案 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--_')
请参见Python demo:
import re
print( re.sub(r'^\W+|\W+$', '', '??cats--') ) # => cats
print( re.sub(r'^[\W_]+|[\W_]+$', '', '_??cats--_') ) # => cats