Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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,我有一根绳子,在哪里 text='<tr align="right"><td>12</td><td>John</td> 打印m 但是当我使用时,我得到了('2','John') m=re.findall(r'align.{13}(\d+).*([A-Z]\w+).*([A-Z]\w+)', text) m=re.findall(r'align.+(\d+).*([A-Z]\w+).*([A-Z]\w+)', text) print

我有一根绳子,在哪里

text='<tr align="right"><td>12</td><td>John</td> 
打印m

但是当我使用时,我得到了('2','John')

m=re.findall(r'align.{13}(\d+).*([A-Z]\w+).*([A-Z]\w+)', text)
m=re.findall(r'align.+(\d+).*([A-Z]\w+).*([A-Z]\w+)', text)
print m
为什么会出问题?我是说为什么{13}很好用,但是.+在我的re中不起作用?
谢谢大家!

使用
+
时,它将匹配尽可能多的字符。由于
\d+
只需匹配至少一个数字,
+
将匹配
“=”right“>1”
,而只保留要由
\d+
匹配的“2”

您的原始示例适用于示例数据。如果需要编写一个适用于其他数据的正则表达式,则需要解释该数据的格式以及如何决定提取哪些部分


此外,考虑到您似乎正在解析HTML,您可能最好使用类似BeautifulSoup的东西,而不是正则表达式。

您确实应该为此使用合适的HTML解析器库,即:

>>> a = '<tr align="right"><td>12</td><td>John</td>'
>>> p = lxml.html.fromstring(a)
>>> p.text_content()
'12John'
>>> p.xpath('//td/text()')
['12', 'John']
>a='12John'
>>>p=lxml.html.fromstring(a)
>>>p.文本内容()
“约翰”
>>>p.xpath(“//td/text()”)
['12','John']

显然,您需要更好地处理多次出现的情况…

我不能用您提供的示例文本和regexp来测试这一点,因为在编写时,它们显然应该找不到匹配项,事实上,在2.7和3.3中都找不到匹配项

但是我猜您想要一个非贪婪匹配,将
+
更改为
+?
将解决您的任何问题

正如Jon Clements在他的回答中指出的那样,这里不应该使用正则表达式。Regexps实际上无法解析像XML这样的非正则语言。当然,不管纯粹主义者怎么说,regexps在快速和肮脏的情况下仍然是非正规语言的有用黑客。但是一旦你遇到了一些不起作用的事情,你首先应该考虑的是,这可能不是一个快速而肮脏的案例,你应该寻找一个真正的解析器。即使您以前从未使用过
ElementTree
API或XPath,它们也非常容易学习,而且所花费的学习时间绝对不会浪费,因为它在将来会派上很多用场

但无论如何,让我们将您的示例简化为您所描述的工作方式,然后看看它的作用:

>>> text='<tr align="right"><td>12</td><td>John</td> 
SyntaxError: EOL while scanning string literal
>>> text='<tr align="right"><td>12</td><td>John</td>'
>>> re.findall(r'align.{13}(\d+).*([A-Z]\w+).*([A-Z]\w+)', text)
[]
>>> re.findall(r'align.{13}(\d+).*([A-Z]\w+)', text)
[('12', 'John')]
>>> re.findall(r'align.+(\d+).*([A-Z]\w+).*([A-Z]\w+)', text)
[]
>>> re.findall(r'align.+(\d+).*([A-Z]\w+)', text)
[('2', 'John')]

Tada.

Um…这两个正则表达式都不会返回与测试字符串匹配的结果。您可以发布您的实际代码和示例数据吗?编辑后,文本现在将引发一个
SyntaxError
,因为它缺少结束引号,但如果我修复了这一点,那么该文本中的任何一个regexp都不匹配。他的原始示例如何工作?
findall
返回带有两个regexp的
[]
。@abarnet:看起来他在正则表达式中包含了额外的内容。他没有通过他正在使用的密码。如果删除中间的
*([A-Z]\w+)
,则它可以工作。我只是通过查看regex和数据来诊断问题,而不是实际运行它。是的,他要么在regexp中包含额外的内容,要么从字符串中剪切内容。但无论如何,regexp都不能匹配字符串。我测试了2.7和3.3来确保,但这是显而易见的。同时,如果删除regexp的中间或结尾,它将匹配
'2'
,而不是
'12'
,这意味着它仍然不能按他所希望的那样工作。谢谢,这就是我要找的!很高兴知道这解决了眼前的问题。不幸的是,不是长期的,但哦,好吧@JonClements:你说得对,我应该编辑这个答案来提出更大的问题。我给你+1。很好的解释正则表达式-伟大的编辑-警告皇帝我猜
>>> re.findall(r'align.+?(\d+).*([A-Z]\w+)', text)
[('12', 'John')]