6

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

例如:

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

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

4

6 回答 6

7

像这样?

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

s是输入字符串。

于 2012-10-12T16:24:02.610 回答
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'

正如马特在评论中指出的那样(感谢马特),这只会删除数字。要删除任何非字母字符,

定义非字母的含义:

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

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

然后剥离:

In [18]: '2foo1c#BAR'.strip(nonletter)
Out[18]: 'foo1c#BAR'
于 2012-10-12T16:25:16.290 回答
2

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

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

这是正则表达式:

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

mo.group(2)想要什么,moMatchObject 在哪里。

于 2012-10-12T16:25:20.040 回答
2

要与 Unicode 兼容:

^\PL+|\PL+$

\PL代表not a letter

于 2012-10-12T17:42:23.293 回答
0

试试这个:

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

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

于 2012-10-12T16:24:17.987 回答
0

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

于 2012-10-12T16:25:26.917 回答