例如,我将“ 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
)。
答案 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