【问题标题】:Python regex not matching all patterns in stringPython正则表达式不匹配字符串中的所有模式
【发布时间】:2016-06-28 17:48:00
【问题描述】:

我想匹配 curl 命令的标题模式,例如:

-H '键:值'

-H“键:值”

这个开关可以出现在中间某处或字符串的末尾。

我的模式:

>>> header_pattern = re.compile(' \-H (?:\'|\").+?:.+?(?:\'|\")(?:\s+|$)')

我的字符串:

>>> a = " -H 'Authorization: Bearer xxx' -H 'Content-Type: text/plain' "

现在我试图找到这个模式的所有实例,但它只匹配第一个模式。

>>> headers = header_pattern.findall(a)
>>> headers
[" -H 'Authorization: Bearer xxx' "]

【问题讨论】:

  • 是的,因为您的模式匹配末尾和开头的空格。将(?:\s+|$) 更改为(?!\S) (后面不跟不是空格的字符)
  • (?:-H|\G)\s([\'"])[^\'"]+\1

标签: python regex


【解决方案1】:

为什么不用argparse module 代替正则表达式:

import argparse
import shlex


parser = argparse.ArgumentParser()
parser.add_argument('command')
parser.add_argument('url')
parser.add_argument('-d', '--data')
parser.add_argument('-b', '--data-binary', default=None)
parser.add_argument('-H', '--header', action='append', default=[])
parser.add_argument('--compressed', action='store_true')


curl_command = "curl https://google.com  -H 'Authorization: Bearer xxx' -H 'Content-Type: text/plain'"

tokens = shlex.split(curl_command)
parsed_args = parser.parse_args(tokens)
print(parsed_args.header)

打印['Authorization: Bearer xxx', 'Content-Type: text/plain']

(灵感来自uncurl package)。

【讨论】:

  • 非常感谢。虽然这不是对问题关注的回答,但确实为我提供了更好的方法来实现我想要做的事情。!
【解决方案2】:

您可以使用此正则表达式来匹配所有标题选项:

header_pattern = re.compile(r'-H\s*([\'"])(.+?)\1')

RegEx Demo

-H 之前没有必要断言空格,但你需要你可以使用:

header_pattern = re.compile(r'(?<=\s)-H\s*([\'"])(.+?)\1')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 2015-11-14
    相关资源
    最近更新 更多