Python 正则表达式:去除数字和带标点的数字

5
我有以下字符串:
 line = "1234567 7852853427.111 https://en.wikipedia.org/wiki/Dictionary_(disambiguation)"

我希望使用正则表达式删除数字1234567和7852853427.111。

这是我的正则表达式:

nline = re.sub("^\d+\s|\s\d+\s|\s\d\w\d|\s\d+$", " ", line)

但它并没有做我希望它做的事情。

有人能指引我走正确的方向吗?


1
关于为什么你的尝试没有成功,我有一些松散的评论:起始锚点似乎是正确的,但结束锚点不正确。它远远不是字符串的结尾!此外,所有这些 | 将整个正则表达式分成不同的部分 - 也就是说,第一部分匹配字符串的开头,但第二部分却不匹配。你可能需要阅读一下如何使用括号创建组。 - Jongware
这个字符串是从哪里来的?是HTML解析吗? - alecxe
1
目前大部分的建议都或多或少地删除了字符串中的每个数字序列。您能否合理地确定要保留的部分中永远不会有数字?删除“前两个单词”怎么样?或者“在http://之前的所有内容”?您的标题提到了标点符号,那么开头的1..2应该被删除吗? - Jongware
1
如果您的正则表达式要求不是很严格,最好使用内置解决方案。对于当前行 line.split()[-1],这种方式更容易。 - godaygo
1
@RadLexus 我认为URL中会有数字。 - Morpheus
4个回答

6

您可以使用:

>>> line = "1234567 7852853427.111 https://en.wikipedia.org/wiki/Dictionary_(disambiguation)" 
>>> print re.sub(r'\b\d+(?:\.\d+)?\s+', '', line)

https://en.wikipedia.org/wiki/Dictionary_(disambiguation)

正则表达式 \b\d+(?:\.\d+)?\s+ 可以匹配一个整数或小数,后面跟着1个或多个空格。其中 \b 表示单词边界。


一个起始锚点会更加安全 :) - Jongware
1
\b 可以工作,但 ^ 不行,因为 7852853427.111 不在开头。 - anubhava
啊,因为你是单独考虑每个数字的。我在想为什么 - 或许OP需要澄清或添加多个示例。我实际上想到了一些简单的东西,比如 ^[\d.\s]+ ... - Jongware
@RadLexus认为这个解决方案会剥离URL中出现的数字。我需要URL中的数字保持完整。 - Morpheus
@Morpheus:现在试试我的更新答案。它不应该影响URL中的数字。 - anubhava

2
这里提供了一种非正则表达式的方法,如果你对正则表达式没有特别严格的要求,可以使用itertools.dropwhile工具:
>>> ''.join(dropwhile(lambda x: not x.isalpha(), line))
'https://en.wikipedia.org/wiki/Dictionary_(disambiguation)'

0

我认为这就是你想要的:

nline = re.sub("\d+\s\d+\.\d+", "", line)

它从行中删除数字。如果您想保留“http…”前面的空格,则第二个参数当然应该是“ ”。

如果您还想记录单个数字字符串,可以像这样将它们分组:

>>> result = re.search("(\d+)\s(\d+\.\d+)", line)
>>> print(result.group(0))
1234567 7852853427.111
>>> print(result.group(1))
1234567
>>> print(result.group(2))
7852853427.111

一个学习和练习正则表达式的好方法是 regex101

0

虽然您正在寻求正则表达式,但更好的解决方案是使用{{link1:str.split}},假设您的字符串始终以{number} {number} {hyperlink}格式呈现。

正如@godaygo所说,您可以使用以下代码:

line = line.split()[-1]

该字符串将在空格处分割,我们选择最后一个子字符串。

如果您想访问所有部分(假设始终有三个),则可以改用以下方法:

num1, num2, url = line.split()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接