0

我正在尝试使用 re 模块,它会返回一堆字符,直到一个特定的字符串跟随一个单独的字符。re 文档似乎表明我可以使用 (?!...) 来完成此操作。我目前正在努力的例子:

str_to_search = 'abababsonab, etc'
first = re.search(r'(ab)+(?!son)', str_to_search)
second = re.search(r'.+(?!son)', str_to_search)

first.group() 是'abab',这是我的目标。然而,second.group() 返回整个 str_to_search 字符串,尽管我试图让它在 'ababa' 处停止,因为随后的 'b' 紧随其后的是 'son'。我哪里错了?

4

3 回答 3

2

这不是最简单的事情,但你可以捕捉到“一个字符后面没有'儿子'”的重复序列。这个重复的表达式应该在一个非捕获组中, (?: ... ),所以它不会弄乱你的匹配结果。(你最终会得到一个额外的匹配组)

尝试这个:

import re

str_to_search = 'abababsonab, etc'
second = re.search(r'(?:.(?!son))+', str_to_search)
print(second.group())

输出:

ababa

在这里看到它:http: //ideone.com/6DhLgN

于 2013-11-07T19:35:14.537 回答
1

这应该有效:

second = re.search(r'(.(?!son))+', str_to_search)
#output: 'ababa'
于 2013-11-07T19:39:11.017 回答
0

不知道你想做什么

  1. 查看 string.partition

  2. '.+?' 是最小匹配器,否则它是贪婪的并得到它

  3. 阅读 group(...) 和 groups(..) 的文档,尤其是在传递组号时

于 2013-11-07T19:32:16.297 回答