问题是非常基本的,我不知道如何从匹配中找出组名。让我在代码中解释一下:
import re
a = list(re.finditer('(?P<name>[^\W\d_]+)|(?P<number>\d+)', 'Ala ma kota'))
如何获取a[0].group(0)
匹配的组名称 - 假设命名模式的数量可以更大?
简化示例以学习基础知识。
我可以反转匹配a[0].groupdict()
,但速度很慢。
答案 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 %}