我有以下正则表达式:
_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)
这显然有很多重复,所以它让我想知道,在一个表达式中重复类似表达式的块的语法是什么(如果存在的话)?
答案 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);