正则表达式删除两个字符串之间的数字

时间:2017-02-03 00:15:41

标签: python regex

我正在尝试检索字符串,忽略使用正则表达式

的其他两个字符串之间的所有数字

在下面的例子中,ABC,DEF和HIJ将始终是相同的值,并且在被搜索的字符串的相同位置,但123和456将始终是不同的值和长度。

我的示例字符串是:

"ABC 123 456 DEF HIJ"

我想留下结果:

"DEF"

我可以使用

通过两行来完成此操作
r'ABC (.*) HIJ' 

然后我可以在那里留下123 456 DEF:

r'[^0-9\s]' 

这似乎应该是可能的,但如果是的话,我似乎无法弄明白。

4 个答案:

答案 0 :(得分:4)

在正则表达式\d+中将匹配1位或更多位数(贪婪)。

>>> import re
>>> s = "ABC 123 456 DEF HIJ"
>>> pat = r'ABC \d+ \d+ (.*) HIJ'
>>> re.findall(pat, s)
['DEF']

答案 1 :(得分:4)

根据输入数据中确切的内容,您可以尝试提取第二个“单词”,允许(并忽略)插入的数字字符串,其格式如下:

foo = "ABC 123 456 DEF 456 HIJ"
pat = r'\w+\s+[\d ]*(\w+)[\d ]*\w+'
re.findall(pat, foo)
['DEF']

或者,regexps可能不是最简单的方法。您可以使用单个正则表达式去掉所有数字字符,将剩余的字符串拆分为空格,然后取第二个元素。

答案 2 :(得分:0)

正则表达式如何:(由于第一条评论而更新)

([A-Za-z] +)\ [A-Za-z] + $

它将捕获由该行末尾的空格分割的2个单词中的第一个。

import re

s = "ABC 123123123 1231231234 DEF HIJ"
pat = r'([A-Za-z]+)\ [A-Za-z]+$'
a = re.findall(pat,s)
print (a)

给出'DEF'

要捕获该位置的多个单词,您可以将模式修改为:

r'\ ([A-Za-z\ ]+)\ [A-Za-z]+$'

对于ABC 234234 46456456 DEF ZYX​​ HIJ的输入,这将为您提供'DEF ZYX​​'。

如果你想强制第一个字符串必须是ABC而最后一个字符串是HIJ,那么wim的另一个答案就可以了。

答案 3 :(得分:0)

基于" ABC,DEF和HIJ将始终是相同的值,并且在被搜索的字符串的相同位置,但123和456将始终是不同的值和长度":

>>> re.sub("ABC \d+ \d+ DEF HIJ", "DEF", "foo1 ABC 12345 67890 DEF HIJ foo2")
'foo1 DEF foo2'