Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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_Python 2.6 - Fatal编程技术网

匹配特定字符序列的Python正则表达式

匹配特定字符序列的Python正则表达式,python,regex,python-2.6,Python,Regex,Python 2.6,我是Python正则表达式的基本用户,需要一些专家的建议 使用正则表达式解决问题 我试图用以下一组规则从字符串中提取一些信息 以$( 开始标记后必须有一个单词 或者,它可能包含以下单词 除了'和“[如果单独使用而不是成对使用]以外的任何字符,直到结束字符) “和”[如果单独使用而不是成对使用]仅当使用\进行转义时才允许使用 如果包含在“或”中,甚至可能允许) 以结尾) 作为一种解决方案,如果允许在字符集[]内定义和使用特殊类型的字符,这将很容易 例如: re.compile("""\$\((

我是Python正则表达式的基本用户,需要一些专家的建议 使用正则表达式解决问题

我试图用以下一组规则从字符串中提取一些信息

  • $(
  • 开始标记后必须有一个单词
  • 或者,它可能包含以下单词
    • 除了'[如果单独使用而不是成对使用]以外的任何字符,直到结束字符
    • [如果单独使用而不是成对使用]仅当使用\进行转义时才允许使用
    • 如果包含在中,甚至可能允许
  • 结尾)
  • 作为一种解决方案,如果允许在字符集[]内定义和使用特殊类型的字符,这将很容易

    例如:

    re.compile("""\$\((\w*)
                  [(any characters except ' and " [if used singly not in pairs] )
                   (' and " [if used singly not in pairs] are allowed only if escaped using a \)
                   ( even ) if enclosed within '' or "")
                  ]\)""", re.VERBOSE)
    
    一些测试:

    • 此$(listInput)尾部->listInput
    • 此$(listInput:DS)尾部->listInput:DS
    • 此$(listInput:J=“)”:S=.o)尾部->listInput:J=“)”:S=.o
    • 此$(listInput:J=join'with)tail->listInput:J=join'with
    在Python中可以做类似的事情吗,或者我的解决方案不是Pythonic的? 还建议,如果有更好的解决方案


    谢谢

    这一个似乎满足了你的要求:

    ^\$\(\w(?::\w |[^]\\']|“[^”]*“|”[^']*“|”[^']*”)\)
    
    细分:

    ^#字符串的开头
    \$\(                # "$("
    (#启动第1组
    \w#一个单词字符
    (?:#启动非捕获组,其中一个:
    \w#一个单词字符
    |#或
    [^)\\“']\\\\除“)”以外的任何字符和特殊字符
    |#或
    “[^”]*”#双引号部分
    |#或
    “[^”]*”#单引号部分
    |#或
    \\“#反斜杠转义为双引号
    |#或
    \\“#反斜杠转义为单引号
    )*#终端组,重复
    )#终端组1
    \)                  # ")"
    
    它符合您的示例要求

    缺点:

    • 在没有更好的“word”规范的情况下,我使用了
      \w
      。熟悉
      \w
      匹配的内容,必要时使用更具体的内容
    • 不允许引用嵌套。(这是Python正则表达式无法做到的)
    • 它在引用的部分中使用结束引号。需要更多信息才能正确执行此操作
    • 引用的节中没有转义引号(尽管可以添加)
    测试:


    谢谢@Tomalak,你的解决方案如我所料帮了我大忙。
    regex = re.compile("^\$\((\w(?:\w|[^)\\\"']|\"[^\"]*\"|'[^']*'|\\\"|\\')*)\)")
    string = "$(listInput:J=join\'with) tail"
    
    r = regex.search(string)
    
    r.groups()
    # -> (u"listInput:J=join\\'with",)
    
    regex.findall(string)
    # -> [u"listInput:J=join\\'with"]