如何在特殊情况下提取两个关键字之间的子字符串?

时间:2019-12-27 11:04:06

标签: python regex

我想在字符串中提取appleeach之间的子字符串。但是,如果each后跟box,我希望结果为空字符串。

详细来说,它表示:

1)apple costs 5 dollars each-> costs 5 dollars

2)apple costs 5 dollars each box->``

我尝试了re.findall('(?<=apple)(.*?)(?=each)'))

它可以解决1)但不能解决2)。

如何解决问题?

谢谢。

2 个答案:

答案 0 :(得分:2)

您可以添加否定的前瞻,断言右边的不是 box。对于比赛,您只能省略捕获组。

(?<=apple).*?(?=each(?! box))

Regex demo

如果您不想匹配前导空间,则可以将其添加到环顾四周

import re
s = "apple costs 5 dollars each"
print(re.findall(r'(?<=apple ).*?(?= each(?! box))', s))

输出

['costs 5 dollars']

您还可以使用不带正向前瞻性的捕获组,而仅使用负向前瞻性。该值在第一个捕获组中。

您可以利用单词边界\b来防止该单词成为较大单词的一部分。

\bapple\b(.*?)\beach\b(?! box)

Regex demo

答案 1 :(得分:1)

不使用正则表达式尝试此操作:

myString = "apple costs 5 dollars each box"

myList = myString.split(" ")

storeString = []

for x in myList:

    if x == "apple":
        continue

    elif x == "each":
        break

    else:

        storeString.append(x)

# using list comprehension 
listToStr = ' '.join(map(str, storeString))

print(listToStr)

输出:

enter image description here