嵌套和混合先行和回溯?

时间:2018-09-08 06:40:16

标签: regex nested regex-lookarounds

例如,我将“ foo 关键字定义在字符串的开头”作为此正则表达式:

(?<=^.{,10})foo

我将“短字符串”定义为此正则表达式(或等于30个字符或更少):

^(?=.{,30}$)

现在的问题是,我想将“关键字 foo 放在短字符串的开头附近”与一个正则表达式匹配,但不确定如何执行。匹配的文本必须是“ foo”,因此应该正确处理周围的文本(带有环顾四周)。

这是我尝试过的,显然不起作用:

^(?=.{0,30)$)(?<=^.{,10})foo

此方法有效,但匹配了太多文本,我只想要 foo ,而不想要 aafoo

^(?=.{0,30)$).{,10}foo

预期的输入和输出:

aaaaaaaaaaa => None
aafooaaaaaa => "foo" (at position 2-5)
aaaaaaaaaaafoo => None (Too far from start of string)
aafooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa => None (String too long)

我在Python 3上使用了第三方PyPI软件包regex(而不是内置的re)。

1 个答案:

答案 0 :(得分:3)

在后向内部,当您将字符串的开头与^匹配时,请使用前向以确保字符串的末尾少于30个字符,以免在后向中消耗任何字符- 然后,您可以在后面的外观中最多使用10个字符来访问foo。您可以使用模式

(?<=^(?=.{0,30}$).{,10})foo

请参阅:

pattern = r'(?<=^(?=.{0,30}$).{,10})foo'

# matches
print(regex.search(pattern, 'text foo text'))

# fails, foo is more than 10 characters away from the start of the string:
print(regex.search(pattern, 'text text text foo text'))

# fails, string is more than 30 characters long:
print(regex.search(pattern, 'text foo text long long string long long string long long string long long string'))

输出:

<regex.Match object; span=(5, 8), match='foo'>
None
None