如何在Python中获取匹配正则表达式的组名?

时间:2015-03-04 13:52:54

标签: python regex python-2.7

问题是非常基本的,我不知道如何从匹配中找出组名。让我在代码中解释一下:

import re    
a = list(re.finditer('(?P<name>[^\W\d_]+)|(?P<number>\d+)', 'Ala ma kota'))

如何获取a[0].group(0)匹配的组名称 - 假设命名模式的数量可以更大?

简化示例以学习基础知识。

我可以反转匹配a[0].groupdict(),但速度很慢。

3 个答案:

答案 0 :(得分:23)

您可以从编译的表达式

中获取此信息
>>> pattern = re.compile(r'(?P<name>\w+)|(?P<number>\d+)')
>>> pattern.groupindex
{'name': 1, 'number': 2}

这使用RegexObject.groupindex attribute

  

(?P<id>)定义的任何符号组名称映射到组号的字典。如果模式中没有使用符号组,则字典为空。

如果您只能访问匹配对象,则可以使用MatchObject.re attribute进入模式:

>>> a = list(re.finditer(r'(?P<name>\w+)|(?P<number>\d+)', 'Ala ma kota'))
>>> a[0]
<_sre.SRE_Match object at 0x100264ad0>
>>> a[0].re.groupindex
{'name': 1, 'number': 2}

如果你想知道匹配的是什么组,请查看该值; None表示从未在比赛中使用的组:

>>> a[0].groupdict()
{'name': 'Ala', 'number': None}

number组从未用于匹配任何内容,因为其值为None

然后,您可以使用以下命令查找正则表达式中使用的名称:

names_used = [name for name, value in matchobj.groupdict().iteritems() if value is not None]

或者如果只有一个组可以匹配,您可以使用MatchObject.lastgroup

name_used = matchobj.lastgroup

作为旁注,你的正则表达有一个致命的缺陷; \d匹配的所有内容也与\w匹配。您永远不会在number可以匹配的位置看到name。扭转模式以避免这种情况:

>>> for match in re.finditer(r'(?P<name>\w+)|(?P<number>\d+)', 'word 42'):
...     print match.lastgroup
... 
name
name
>>> for match in re.finditer(r'(?P<number>\d+)|(?P<name>\w+)', 'word 42'):
...     print match.lastgroup
... 
name
number

但请注意,以数字开头的单词仍然会使您的简单案例混淆:

>>> for match in re.finditer(r'(?P<number>\d+)|(?P<name>\w+)', 'word42 42word'):
...     print match.lastgroup, repr(match.group(0))
... 
name 'word42'
number '42'
name 'word'

答案 1 :(得分:4)

首先,你的正则表达式在语法上是错误的:你应该把它写成r'(?P<name>\w+)|(?P<number>\d+)'。此外,即使这个reg expr也不起作用,因为特殊序列\w匹配所有字母数字字符,因此也匹配\d匹配的所有字符。 您应该将其更改为r'(?P<number>\d+)|(?P<name>\w+)',以使\d优先于\w。 但是,您可以使用匹配对象的属性lastgroup来获取匹配组的名称,即:     [m.lastgroup for m in re.finditer(r'(?P<number>\d+)|(?P<name>\w+)', 'Ala ma 123 kota')] 生产:     ['name', 'name', 'number', 'name']

答案 2 :(得分:0)

{%extends "layout.html" %} {% block content %}
<script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script>
<script type="text/javascript">
  $(document).ready(function(){
        var i=0;
        $.ajax({
            url: "http://localhost:5000/get_data",
        }).done(function(data) {
            data_parsed=jQuery.parseJSON(data);
            data_parsed.forEach(function(dt){
                #HERE IS THE PROBLEMATIC PART
                $("pquestions").append("<p>"+ dt['id'] +". " + dt['question'] + " " +
                                        "<input id=\""+"question"+i+"\">" + "</input>" +
                                        "<button type=\""+"button"+"\" id=\""+i+"\">" +
                                        "</p>");
                i++;

            });
            //$('#questiontests').html(jQuery.parseJSON(data)['0']["question"]).text();
            //console.log(jQuery.parseJSON(data).length);
        });

  });
</script>

<script type="text/javascript">
    $(document).on("click",'button',function() {
        var x = document.getElementById("question"+this.id).value;
        var current_id=this.id
        $.ajax({
            url: "http://localhost:5000/get_data",
        }).done(function(data) {
            data_parsed=jQuery.parseJSON(data)
            console.log(data_parsed[current_id]["answer"])
            if (x==data_parsed[current_id]["answer"]){
                sweetAlert(
                    {
                    title: "Juist!",
                    icon: "success"
                    })
            } else {
                sweetAlert({
                    title: "Ontjuist!",
                    icon: "warning",
                    text: "Uw response is " + x + " maar het antwoord is " + data_parsed[current_id]["answer"],
                    })
            }
            console.log("button click");
        });
    });
</script>

<section class="page-section" style="background-color:lightblue" id="about">
    <div class="container">
        <div class="row justify-content-center">
            <div class="col-lg-8 text-center">
                <h2 class="text-black-50 mt-0">Dutch oefening</h2>
                <h5 class="text-black-50 mt-0 font-italic">
                    Hier kun je je eigen oefening toevoegen, geen duplicaten mogelijk:
                </h5>
                <form action="/add_question" method="post">
                  <label for="fname">Vraag:</label>
                  <input type="text" id="fname" name="fname">
                  <label for="lname">Antwoord:</label>
                  <input type="text" id="lname" name="lname">
                  <input type="submit" value="onslaan">
                </form>
                <h5 class="text-black-50 mt-0 font-italic">
                    Hier kun je een rij verwijderen:
                </h5>
                <form action="/delete" method="post">
                  <label for="deletes">Rij om te verwijderen:</label>
                  <input type="text" id="deletes" name="deletes">
                  <input type="submit" value="verwijder">
                </form>
                <h5 class="text-black-50 mt-0 font-italic">
                    Schrijf de vertaling van elke zin, en druk op de knop om te controleren
                </h5>
                <pquestions id="#all_questions">
                </pquestions>
            </div>
        </div>
    </div>

</section> {% endblock %}