如何在Python中从字符串的开头和结尾剥离非字母字符?

utugiqy6  于 2024-01-05  发布在  Python
关注(0)|答案(6)|浏览(154)

我需要从单词的开头和结尾删除所有非字母字符,但如果它们出现在两个字母之间,则保留它们。
举例来说:

'123foo456' --> 'foo'
'2foo1c#BAR' --> 'foo1c#BAR'

字符串
我试过使用re.sub(),但我不能写正则表达式。

z6psavjg

z6psavjg1#

就像这样?

re.sub('^[^a-zA-Z]*|[^a-zA-Z]*$','',s)

字符串
s是输入字符串。

vbopmzt1

vbopmzt12#

你可以使用str.strip来实现:

In [1]: import string

In [4]: '123foo456'.strip(string.digits)
Out[4]: 'foo'

In [5]: '2foo1c#BAR'.strip(string.digits)
Out[5]: 'foo1c#BAR'

字符串
正如Matt在评论中指出的(谢谢,Matt),这只删除了数字。要删除任何非字母字符,
定义一下非字母的含义:

In [22]: allchars = string.maketrans('', '')

In [23]: nonletter = allchars.translate(allchars, string.letters)


然后剥离:

In [18]: '2foo1c#BAR'.strip(nonletter)
Out[18]: 'foo1c#BAR'

w1jd8yoj

w1jd8yoj3#

通过你的两个例子,我能够使用Python的非贪婪语法创建一个正则表达式,如下所述。我将输入分为三个部分:非字母,完全字母,然后非字母,直到最后。下面是一个测试运行:

1:[123]   2:[foo]   3:[456]
1:[2]   2:[foo1c#BAR]   3:[]

字符串
下面是正则表达式:

^([^A-Za-z]*)(.*?)([^A-Za-z]*)$


mo.group(2),其中mo是MatchObject。

fbcarpbf

fbcarpbf4#

要兼容Unicode:

^\PL+|\PL+$

字符串
\PL代表not a letter

hsvhsicv

hsvhsicv5#

试试这个:

re.sub(r'^[^a-zA-Z]*(.*?)[^a-zA-Z]*$', '\1', string);

字符串
圆括号捕获字符串开头和结尾处的非字母字符串之间的所有内容。?确保.不会捕获结尾处的任何非字母字符串。然后,replacement只是打印捕获的组。

相关问题