Python 正则表达式:带有可选部分的字符串
我正在尝试解析一些docstring docstrings的一个示例是: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
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)
# ^^ ^^