Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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,我正在尝试分析以下文本: data:{ url: 'stage-player-stat' }, defaultParams: { stageId: 9155, teamId: 32, playerId: -1, field: 2 }, 使用正则表达式: stagem

我正在尝试分析以下文本:

data:{
                url: 'stage-player-stat'
            },
            defaultParams: {
                stageId: 9155,
                teamId: 32,
                playerId: -1,
                field: 2
            },
使用正则表达式:

stagematch = re.compile('data:{url: \'ws-stage-stat\'},defaultParams: {},', re.S)
然而,我并没有用这个来匹配。但在我看来这是正确的。谁能告诉我哪里出了问题


谢谢

除了用regexp解析JSON这个更深层次的问题之外,您的regexp不允许在“{”和“url:”之类的组件之间出现空白,也不允许在
defaultParams:{}
中出现所有文本

并且您的regexp URL
'ws-stage-stat'
与文本的URL
'stage-player-stat'
不匹配

以下内容与您的数据相匹配。(regexp模式通常使用原始字符串文字,以避免反斜杠加倍。)


您的正则表达式没有返回所需匹配项有几个原因:

  • 您的正则表达式实际上不匹配

    *
    ws-stage stat
    ≠ <代码>舞台玩家状态,因此您将无法获得匹配

    **还要考虑
    非单词字符
    多行
    ,或
    大写/小写

  • 使用
    匹配组
    将允许您捕获字符串的所需部分

  • 现在还不清楚您到底想做什么。正如其他人所说,使用库或特定的解析器可能更好;我不是一个提倡这样或那样的人,而是一个有效的人

    如果您想使用正则表达式(包括其他URL)匹配字符串(json?),则可以执行以下操作:

    p = re.compile(ur'\'(.*)\'|(\w+):\s(.+(?=[,])|.+\n)')
    list = re.findall(p, str)
    print(list)
    
    结果:

    [(u'', u'url', u"'stage-player-stat'\n"), (u'', u'defaultParams', u'{\n'), (u'', u'stageId', u'9155'), (u'', u'teamId', u'32'), (u'', u'playerId', u'-1'), (u'', u'field', u'2\n'), (u'', u'url', u"'ws-stat'\n"), (u'', u'defaultParams', u'{\n'), (u'', u'stageId', u'9155'), (u'', u'teamId', u'32'), (u'', u'playerId', u'-1'), (u'', u'field', u'2\n'), (u'', u'stageId', u'9155'), (u'', u'teamId', u'32'), (u'', u'playerId', u'-1')]
    

    它看起来像json…你真的想用正则表达式来处理它吗?@JakubJirutka我已经很久没有使用Python了,我以前也从未使用过json解析器。@user3045351好吧,那么你应该先读一读。但是首先试着获取这段数据,不管它的来源是什么,都是有效的json。你可以在这里检查@jerry101 s,如果需要的话,请跟我开个玩笑如果放置re.M,则可以跨多行编写正则表达式?多行选项仅更改
    ^
    $
    锚定的含义(这分别意味着
    行的开始
    行的结束
    ),仅此而已。@user3045351我添加了一个与您的示例数据匹配的模式。@casimirithippolyte我对
    re.M
    进行了更正。这里不需要它,因为此模式没有
    ^
    $
    锚。
    [(u'', u'url', u"'stage-player-stat'\n"), (u'', u'defaultParams', u'{\n'), (u'', u'stageId', u'9155'), (u'', u'teamId', u'32'), (u'', u'playerId', u'-1'), (u'', u'field', u'2\n'), (u'', u'url', u"'ws-stat'\n"), (u'', u'defaultParams', u'{\n'), (u'', u'stageId', u'9155'), (u'', u'teamId', u'32'), (u'', u'playerId', u'-1'), (u'', u'field', u'2\n'), (u'', u'stageId', u'9155'), (u'', u'teamId', u'32'), (u'', u'playerId', u'-1')]