大多数Pythonic都是从字符串中删除所有非字母数字的前导字符

Bly*_*ons -3 python string alphanumeric non-alphanumeric

例如

!@#123myname --> myname
!@#yourname!@#123 --> yourname!@#123
Run Code Online (Sandbox Code Playgroud)

有很多SO"删除所有字母数字字符的pythonic方法"的例子,但是如果我只想删除导致第一个字母字符的非字母字符,那么最好的方法是什么?

我可以使用while循环,但我正在寻找一个更好的python解决方案

kha*_*ler 6

只是用str.lstrip.

它需要一个包含要从字符串左侧删除的字符的字符串,并将删除这些字符,而不管它们出现的顺序如何.例如:

s = "!@#yourname!@#"
print s.lstrip('@!#') # yourname!@#
Run Code Online (Sandbox Code Playgroud)

  • 这是迄今为止最pythonic的答案。如果你想删除所有标点符号,你也可以使用`s.lstrip(string.punctuation)` (3认同)
  • 虽然这很好并且可读,但它可能无法回答所述的问题.海报想要从字符串的开头删除所有*非字母数字*字符.目前还不清楚是否知道唯一的非字母数字字符是`!@#(或者在`string.punctuation`中,就此而言).更通用的解决方案是首先使用`leftovers = set(s) - set(string.ascii_letters)`找到它们,然后删除:`s.lstrip(str(leftovers))`.虽然这个答案可能就足够了,如果`!#`是所有OP的预期. (2认同)

Pad*_*ham 5

您可以在字符串开头使用匹配非字母数字字符的正则表达式:

s = '!@#myname!!'
r = re.compile(r"^\W+") # \W non-alphanumeric at start ^ of string
Run Code Online (Sandbox Code Playgroud)

输出:

In [28]: r = re.compile(r"^\W+")  
In [29]: r.sub("",'!@#myname')
Out[29]: 'myname'    
In [30]: r.sub("",'!@#yourname!@#')
Out[30]: 'yourname!@#'
Run Code Online (Sandbox Code Playgroud)

\W+将保留下划线,以便只保留开头的字母和数字,我们可以:

s = '!@#_myname!!'
r = re.compile(r"^[^A-Za-z0-9]+") 

print(r.sub("",s))
myname!!
Run Code Online (Sandbox Code Playgroud)

如果您只想删除第一个字母:

r = re.compile(r"^[^A-Za-z]+") 
Run Code Online (Sandbox Code Playgroud)