为什么我不能用这个python正则表达式摆脱L?

时间:2014-11-03 18:59:25

标签: python regex

我试图在python中使用正则表达式去掉整数末尾的Ls:

import re
s = '3535L sadf ddsf df 23L 2323L'
s = re.sub(r'\w(\d+)L\w', '\1', s)

但是,这个正则表达式甚至不会更改字符串。我也试过s = re.sub(r'\w\d+(L)\w', '', s),因为我认为L可能被捕获并被删除,但这也不起作用。

5 个答案:

答案 0 :(得分:2)

\w = [a-zA-Z0-9_]


换句话说,\w不包含空格字符。每个L都位于单词的末尾,因此后面没有任何“单词字符”。也许你在寻找word boundaries

re.sub(r'\b(\d+)L\b', '\1', s)

Demo

答案 1 :(得分:2)

我不确定您首先尝试对这些\w做什么,但要匹配一串数字后跟L,只需使用{{1}并且要删除\d+L,您只需要将L部分放入捕获组中,这样就可以将其分配给整个事物:

\d+

这是正则表达式:

>>> s = '3535L sadf ddsf df 23L 2323L'
>>> re.sub(r'(\d+)L', r'\1', s)
'3535 sadf ddsf df 23 2323'

Regular expression visualization

Debuggex Demo

当然,这也会将(\d+)L 转换为123LBQ,但我在您的示例或您对问题的描述中没有看到任何表明这是可行的,或者哪个你可能想要的结果,所以......

答案 2 :(得分:1)

您可以使用后面的断言

>>> s = '3535L sadf ddsf df 23L 2323L'
>>> s = re.sub(r'\w(?<=\d)L\b', '', s)
>>> s
'353 sadf ddsf df 2 232'

(?<=\d)L断言L以数字为前提,在这种情况下将其替换为null ''

答案 3 :(得分:1)

试试这个: re.sub(r'(?<=\d)L', '\1', s)

这使用lookbehind来找到一个数字后跟一个“L”。

答案 4 :(得分:1)

为什么不使用-IMO更具可读性?generator expression

>>> s = '3535L sadf ddsf df 23L 2323L'
>>> ' '.join(x.rstrip('L') if x[-1:] =='L' and  x[:-1].isdigit() else x for x in s.split())
'3535 sadf ddsf df 23 2323'