2

只是想知道连续获得七个且只有七个数字的最佳正则表达式是什么?有没有办法[0-9]简洁地使用七次?还是我应该只用几个???

这七个数字是指可以出现在学区 wiki 页面上任何位置的学区 ID 代码。它们将通过空格与其他内容分开。

输入:BeautifulSoup of these pages NCES D id on the right in the table: https://en.wikipedia.org/wiki/Anniston_City_Schools 同样的事情:https ://en.wikipedia.org/wiki/Huntsville_City_Schools

输出:代表区 ID 的七位数字 例如:1234567

4

7 回答 7

7

根本不要使用正则表达式。使用 HTML 解析器,例如BeautifulSoup

from urllib2 import urlopen, Request
from bs4 import BeautifulSoup

resp = urlopen(Request('https://en.wikipedia.org/wiki/Anniston_City_Schools',
                       headers={'User-Agent': 'Stack Overflow'}))
soup = BeautifulSoup(resp.read())

table = soup.find('table', class_='infobox')

for row in table.find_all('tr'):
    if 'NCES' in row.th.text:
        nces = row.td.a.text
        print nces
        break

这会加载 URL 数据,找到“信息框”表,然后是 NCES 条目所在的行。

HTML 源代码中有12 个正好为 7 位的数字,但上面的代码一次性提取了正确的数字。

于 2013-08-15T20:57:10.357 回答
5

这会查找 7 个数字,然后确保下一个字符不是另一个数字

\b[0-9]{7}(?![0-9])

正则表达式可视化

如果您可以在整个 7 位数字周围匹配空格,这也可以

\b[0-9]{7}\b

正则表达式可视化


如果您想匹配 Asad 的示例,NCSD Code:1234567这应该可以

(?<![0-9])[0-9]{7}(?![0-9])

正则表达式可视化

于 2013-08-15T20:44:25.550 回答
4

你可以使用这个:

(?<=^|[^0-9])[0-9]{7}(?=$|[^0-9])

它将仅匹配 7 位数字,不多也不少。

或者使用负面的环视...

(?<![0-9])[0-9]{7}(?![0-9])
于 2013-08-15T20:43:17.457 回答
2

我会去

[^0-9]([0-9]{7})[^0-9]

正则表达式可视化

在 Debuggex 上实时编辑

于 2013-08-15T20:47:13.323 回答
1

你可以做:

'\s(\d{7})\s'

使用 Pythonre模块:

re.findall('\s(\d{7})\s',s)

测试:

s = 'abc 1 abc 22 abc 333 abcd 666666 ab7777777bc 7777777 abc 88888888'

给出:

#['7777777']
于 2013-08-15T20:58:53.313 回答
0

如果您的整个字符串可能只是一个七位数的字符串,则可以使用以下表达式。它完全匹配七个数字,并且不允许输入中的任何其他字符(不会匹配g1234567or 1234567g):

^(\d{7})$
于 2013-08-15T20:42:45.813 回答
0

最干净的正则表达式是

(?<!\d)\d{7}(?!\d)

但是在 Python 3\d中可以匹配来自其他书写系统的数字,所以它应该在前面加上(?a)或使用[0-9]而不是\d.

解释:

(?<!\d) # zero-width negative look-behind assertion
        # ensures that the following was not preceded by a digit

\d{7}   # a digit repeated exactly 7 times

(?!\d)  # zero-width negative look-ahead assertion
        # ensures that the previously matched 7 digits are not
        # followed by an eighth digit.

这里的许多其他答案都是错误的,因为它们将无法匹配,例如"1234567 blablabla"or "<td>1234567</td>"

于 2013-08-16T01:18:23.090 回答