在正则表达式中重复大元素

时间:2014-03-06 03:34:25

标签: python regex

我有以下正则表达式:

_parser = re.compile('''
                    (?P<a>-?[0-9]+(\.[0-9]+)?(/-?[0-9]+(\.[0-9]+)?)?)?x[+\-]
                    (?P<b>-?[0-9]+(\.[0-9]+)?(/-?[0-9]+(\.[0-9]+)?)?)?y[+\-]
                    (?P<c>-?[0-9]+(\.[0-9]+)?(/-?[0-9]+(\.[0-9]+)?)?)?=0
                    ''', re.VERBOSE)

这显然有很多重复,所以它让我想知道,在一个表达式中重复类似表达式的块的语法是什么(如果存在的话)?

1 个答案:

答案 0 :(得分:0)

你可以这样做:

在另一个捕获组中环绕[0-9]+(\.[0-9]+)?(/-?[0-9]+(\.[0-9]+),然后用\2引用它,因为它是正则表达式中的第二个开放式对象:

_parser = re.compile('''
     (?P<a>-?([0-9]+(\.[0-9]+)?(/-?[0-9]+(\.[0-9]+))?)?)?x[+\-]
              (?P<b>-?\2?)?)?y[+\-]
                (?P<c>-?\2?)?)?=0
                ''', re.VERBOSE)

您也可以通过创建正则表达式的字符串,然后重复使用该字符串变量来完成此操作。我不懂Python,但在Java中它是这样的:

String sRegexPiece = "[0-9]+(\\.[0-9]+)?(/-?[0-9]+(\\.[0-9]+)";
String sRegexWhole = "(?P<a>-?" + sRegexPiece + "?)?x[+\-]" + sLS + //sLS: line separator
    "(?P<b>-?" + sRegexPiece + "?)?)?y[+\-]" + sLS + 
    "(?P<c>-?" + sRegexPiece + "?)?)?=0" + sLS + 
    "'''";
Pattern p = Pattern.compile(sRegexWhole);