我正在尝试检索字符串,忽略使用正则表达式
的其他两个字符串之间的所有数字在下面的例子中,ABC,DEF和HIJ将始终是相同的值,并且在被搜索的字符串的相同位置,但123和456将始终是不同的值和长度。
我的示例字符串是:
"ABC 123 456 DEF HIJ"
我想留下结果:
"DEF"
我可以使用
通过两行来完成此操作r'ABC (.*) HIJ'
然后我可以在那里留下123 456 DEF:
r'[^0-9\s]'
这似乎应该是可能的,但如果是的话,我似乎无法弄明白。
答案 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'