从单词的开头和结尾删除非字母字符

时间:2012-10-12 16:17:29

标签: python regex

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

例如:

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

我尝试使用re.sub(),但我无法编写正则表达式。

6 个答案:

答案 0 :(得分:6)

您可以使用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'

答案 1 :(得分:5)

像这样?

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

s是输入字符串。

答案 2 :(得分:2)

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

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

这是正则表达式:

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

mo.group(2)你想要什么,其中mo是MatchObject。

答案 3 :(得分:2)

兼容unicode:

^\PL+|\PL+$

\PL代表not a letter

答案 4 :(得分:0)

试试这个:

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

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

答案 5 :(得分:0)

result = re.sub('(.*?)([a-z].*[a-z])(.*)', '\\2', '23WERT#3T67', flags=re.IGNORECASE)