Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式:带有可选部分的字符串_Python_Regex - Fatal编程技术网

Python 正则表达式:带有可选部分的字符串

Python 正则表达式:带有可选部分的字符串,python,regex,Python,Regex,我正在尝试解析一些docstring docstrings的一个示例是: Test if a column field is larger than a given value This function can also be called as an operator using the '>' syntax Arguments: - DbColumn self - string or float value: the value to

我正在尝试解析一些docstring

docstrings的一个示例是:

Test if a column field is larger than a given value
    This function can also be called as an operator using the '>' syntax

    Arguments:
        - DbColumn self
        - string or float value: the value to compare to
            in case of string: lexicographic comparison
            in case of float: numeric comparison
    Returns:
        DbWhere object
参数和
返回部分都是可选的。我希望我的正则表达式分组返回描述(第一行)、
参数
部分(如果存在)和
返回部分(如果存在)

我现在拥有的正则表达式是:

m = re.search('(.*)(Arguments:.*)(Returns:.*)', s, re.DOTALL)
如果所有三个部分都存在,但只要
参数
返回的部分不可用,则可以使用and。我尝试了几种非贪婪修饰符的变体,如
,但都没用

编辑:
参数和
返回部分出现时,我实际上只想分别匹配
参数和
返回部分之后的文本

谢谢

试试:

re.search('^(.*?)(Arguments:.*?)?(Returns:.*)?$', s, re.DOTALL)
只需通过附加一个
使第二组和第三组可选,并通过(再次)在前两组上附加一个
使前两组的限定符不贪婪(是的,令人困惑)

另外,如果对模式的第一组使用非贪婪修饰符,它将匹配最短的子字符串,对于
*
,它是空字符串。您可以通过在模式末尾添加行尾字符(
$
)来克服这一问题,这将强制第一组匹配尽可能少的字符以满足模式,即当不存在
参数时,整个字符串将返回
节,当存在时,
将返回这些节之前的所有内容


编辑:好的,如果您只想捕获
参数:
返回:
标记后的文本,那么您必须再加入几个组。我们不会使用所有的组,因此命名它们-如果您想在可选的
参数之后匹配文本:
返回:
部分,并且您不想使用
(?p…)
来命名捕获组,您还可以使用,
(?:…)
,常规括号的非捕获版本

正则表达式如下所示:

m = re.search('^(.*?)(?:Arguments:(.*?))?(?:Returns:(.*?))?$', doc, re.DOTALL)
#                     ^^                  ^^
根据蟒蛇3:

(?:…)

普通括号的非捕获版本。匹配括号内的任何正则表达式,但在执行匹配或稍后在模式中引用后,无法检索组匹配的子字符串


订单总是固定的吗?也就是说,
参数是否总是在标准文本之后,
返回之前?
?是的,顺序总是固定的。效果很好!如果对于可选部分,我只想匹配
参数
返回
后的文本,比如
re.search('^(.*?)(参数:(.*))(返回:(.*)?'),doc,re.DOTALL)
有效,但我不关心它返回的第二组和第四组。我编辑了我的答案。只需命名组,忘记
groups()
,改用
groupdict()
m = re.search('^(.*?)(?:Arguments:(.*?))?(?:Returns:(.*?))?$', doc, re.DOTALL)
#                     ^^                  ^^