如何匹配可变大小反向引用的长度而不是内容

时间:2016-01-08 08:38:38

标签: python regex

目前我正在尝试编写一个正则表达式(使用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'的发生之间的内容,只是距离。

我知道反向引用可以用来多次匹配同一个未知文本,但我想我不知道是否有不同的方式来使用它们,或者我是否应该完全使用其他方法/模式。提示?

提前致谢!

1 个答案:

答案 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