我需要从单词的开头和结尾删除所有非字母字符,但如果它们出现在两个字母之间,则保留它们。举例来说:
'123foo456' --> 'foo' '2foo1c#BAR' --> 'foo1c#BAR'
字符串我试过使用re.sub(),但我不能写正则表达式。
re.sub()
z6psavjg1#
就像这样?
re.sub('^[^a-zA-Z]*|[^a-zA-Z]*$','',s)
字符串s是输入字符串。
s
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'
型
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。
mo.group(2)
mo
fbcarpbf4#
要兼容Unicode:
^\PL+|\PL+$
字符串\PL代表not a letter
\PL
not a letter
hsvhsicv5#
试试这个:
re.sub(r'^[^a-zA-Z]*(.*?)[^a-zA-Z]*$', '\1', string);
字符串圆括号捕获字符串开头和结尾处的非字母字符串之间的所有内容。?确保.不会捕获结尾处的任何非字母字符串。然后,replacement只是打印捕获的组。
?
.
eit6fx6z6#
第一个月
6条答案
按热度按时间z6psavjg1#
就像这样?
字符串
s
是输入字符串。vbopmzt12#
你可以使用str.strip来实现:
字符串
正如Matt在评论中指出的(谢谢,Matt),这只删除了数字。要删除任何非字母字符,
定义一下非字母的含义:
型
然后剥离:
型
w1jd8yoj3#
通过你的两个例子,我能够使用Python的非贪婪语法创建一个正则表达式,如下所述。我将输入分为三个部分:非字母,完全字母,然后非字母,直到最后。下面是一个测试运行:
字符串
下面是正则表达式:
型
和
mo.group(2)
,其中mo
是MatchObject。fbcarpbf4#
要兼容Unicode:
字符串
\PL
代表not a letter
hsvhsicv5#
试试这个:
字符串
圆括号捕获字符串开头和结尾处的非字母字符串之间的所有内容。
?
确保.
不会捕获结尾处的任何非字母字符串。然后,replacement只是打印捕获的组。eit6fx6z6#
第一个月