我需要从单词的开头和结尾删除所有非字母字符,但如果它们出现在两个字母之间,请保留它们。
例如:
'123foo456' --> 'foo'
'2foo1c#BAR' --> 'foo1c#BAR'
我尝试使用re.sub()
,但我无法编写正则表达式。
像这样?
re.sub('^[^a-zA-Z]*|[^a-zA-Z]*$','',s)
s
是输入字符串。
您可以为此使用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'
通过您的两个示例,我能够使用 Python 的非贪婪语法创建一个正则表达式,如此处所述。我将输入分成三个部分:非字母、完全字母,然后是非字母直到最后。这是一个测试运行:
1:[123] 2:[foo] 3:[456]
1:[2] 2:[foo1c#BAR] 3:[]
这是正则表达式:
^([^A-Za-z]*)(.*?)([^A-Za-z]*)$
你mo.group(2)
想要什么,mo
MatchObject 在哪里。
要与 Unicode 兼容:
^\PL+|\PL+$
\PL
代表not a letter
试试这个:
re.sub(r'^[^a-zA-Z]*(.*?)[^a-zA-Z]*$', '\1', string);
圆括号捕获字符串开头和结尾的非字母字符串之间的所有内容。?
确保最后也.
不会捕获任何非字母字符串。然后替换简单地打印捕获的组。
result = re.sub('(.*?)([a-z].*[a-z])(.*)', '\\2', '23WERT#3T67', flags=re.IGNORECASE)