目前我正在尝试编写一个正则表达式(使用Python' s re模块),它会发现' a'在给定长度的字符串中。我试图匹配一些不同的模式,但那些给我带来麻烦的模式看起来像这样:
a.a.a
a..a..a
a...a...a
基本上我试图找到至少包含三次' a'的匹配,但它们必须等间隔。到目前为止,我已经尝试了正则表达式:
regex1 = r'a(.|..|...)a\1a'
regex2 = r'a(.{1,3})a\1a'
但我遇到的问题是反向引用会重复匹配的文本。因此,例如,我的正则表达式将匹配#1而不是#2,
1. aoooaoooa
2. aoooabbba
实际上,我并不关心' a'的发生之间的内容,只是距离。
我知道反向引用可以用来多次匹配同一个未知文本,但我想我不知道是否有不同的方式来使用它们,或者我是否应该完全使用其他方法/模式。提示?
提前致谢!
答案 0 :(得分:1)
如果安装Python PyPi regex module,则可以使用子模式递归功能。只需使用捕获组包装重复部分,然后使用UINavigationBar
,其中 n 是捕获组ID。
(?n)
<强>解释强>:
>>> import regex
>>> a = "aoooaoooa"
>>> b = "aoooabbba"
>>> rx = r"a(.{1,3})a(?1)a"
>>> print(regex.search(rx, a).group(0))
aoooaoooa
>>> print(regex.search(rx, b).group(0))
aoooabbba
>>> print(regex.search(rx, "abacca").group(0))
abacca
- 匹配文字a
a
- 匹配并捕获到第1组除换行符之外的一到三个字符(.{1,3})
- 匹配文字a
a
- 一个递归构造,告诉正则表达式引擎检索模式而不是属于组1的值(即(?1)
) .{1,3}
- 匹配文字a
PyPi正则表达式模块不支持平衡结构(.NET可以),因此您必须添加更多代码来检查是否匹配相等长度的组。幸运的是,regex模块将所有捕获的子匹配保留在a
对象中。因此,要从有效匹配中排除.captures
,您只需使用:
abacca