首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将所有名称与末尾的5位数字完全匹配。

将所有名称与末尾的5位数字完全匹配。
EN

Stack Overflow用户
提问于 2014-11-09 18:37:05
回答 3查看 178关注 0票数 2

我有一个这样的文本文件:

代码语言:javascript
运行
复制
john123:
1
2
coconut_rum.zip

bob234513253:
0
jackdaniels.zip
nowater.zip 
3

judy88009:
dontdrink.zip
9

tommi54321:
dontdrinkalso.zip
92

...

我有上百万这样的条目。

我想取一个5位数长的名字和号码。我试过这个:

代码语言:javascript
运行
复制
matches = re.findall(r'\w*\d{5}:',filetext2)

但是它给了我至少5位数的结果。

代码语言:javascript
运行
复制
['bob234513253:', 'judy88009:', 'tommi54321:']

Q1:,如何找到确切的5位数的名字?

Q2:,我想用5位数追加与这些名称相关联的zip文件。我如何使用正则表达式来完成这个任务?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-09 18:38:29

这是因为\w包含数字字符:

代码语言:javascript
运行
复制
>>> import re
>>> re.match('\w*', '12345')
<_sre.SRE_Match object at 0x021241E0>
>>> re.match('\w*', '12345').group()
'12345'
>>>

您需要更加具体地告诉Python,您只需要字母:

代码语言:javascript
运行
复制
matches = re.findall(r'[A-Za-z]*\d{5}:',filetext2)

关于您的第二个问题,您可以使用以下内容:

代码语言:javascript
运行
复制
import re
# Dictionary to hold the results
results = {}
# Break-up the file text to get the names and their associated data.
# filetext2.split('\n\n') breaks it up into individual data blocks (one per person).
# Mapping to str.splitlines breaks each data block into single lines.
for name, *data in map(str.splitlines, filetext2.split('\n\n')):
    # See if the name matches our pattern.
    if re.match('[A-Za-z]*\d{5}:', name):
        # Add the name and the relevant data to the file.
        # [:-1] gets rid of the colon on the end of the name.
        # The list comprehension gets only the file names from the data.
        results[name[:-1]] = [x for x in data if x.endswith('.zip')]

或者,如果没有所有的评论:

代码语言:javascript
运行
复制
import re
results = {}
for name, *data in map(str.splitlines, filetext2.split('\n\n')):
    if re.match('[A-Za-z]*\d{5}:', name):
        results[name[:-1]] = [x for x in data if x.endswith('.zip')]

以下是一个示范:

代码语言:javascript
运行
复制
>>> import re
>> filetext2 = '''\
... john123:
... 1
... 2
... coconut_rum.zip
...
... bob234513253:
... 0
... jackdaniels.zip
... nowater.zip
... 3
...
... judy88009:
... dontdrink.zip
... 9
...
... tommi54321:
... dontdrinkalso.zip
... 92
... '''
>>> results = {}
>>> for name, *data in map(str.splitlines, filetext2.split('\n\n')):
...     if re.match('[A-Za-z]*\d{5}:', name):
...         results[name[:-1]] = [x for x in data if x.endswith('.zip')]
...
>>> results
{'tommi54321': ['dontdrinkalso.zip'], 'judy88009': ['dontdrink.zip']}
>>>

不过,请记住,同时读取文件的所有内容并不是非常有效。相反,您应该考虑让生成器函数一次生成一个数据块。此外,您还可以通过预编译Regex模式来提高性能。

票数 3
EN

Stack Overflow用户

发布于 2014-11-09 21:41:55

代码语言:javascript
运行
复制
import re

results = {}

with open('datazip') as f:
    records = f.read().split('\n\n')

for record in records:
    lines = record.split()
    header = lines[0]

    # note that you need a raw string
    if re.match(r"[^\d]\d{5}:", header[-7:]):

        # in general multiple hits are possible, so put them into a list
        results[header] = [l for l in lines[1:] if l[-3:]=="zip"]

print results

输出

代码语言:javascript
运行
复制
{'tommi54321:': ['dontdrinkalso.zip'], 'judy88009:': ['dontdrink.zip']}

评论

我试图保持它非常简单,如果您的输入很长,您应该按照iCodez的建议,实现一个生成器,该生成器一次只记录一条yield,而对于regexp匹配,我尝试了一些优化,只搜索标题的最后7个字符。

增编:记录生成器的简化实现

代码语言:javascript
运行
复制
import re

def records(f):
    record = []
    for l in f:
        l = l.strip()
        if l:
            record.append(l)
        else:
            yield record
            record = []
    yield record

results = {}
for record in records(open('datazip')):
    head = record[0]
    if re.match(r"[^\d]\d{5}:", head[-7:]):
        results[head] = [ r for r in record[1:] if r[-3:]=="zip"]
print results
票数 1
EN

Stack Overflow用户

发布于 2014-11-09 18:40:09

您需要将regex限制在单词的末尾,这样它就不会再使用\b了。

代码语言:javascript
运行
复制
[a-zA-Z]+\d{5}\b

参见例如http://regex101.com/r/oC1yO6/1

判断器会匹配

代码语言:javascript
运行
复制
judy88009:

tommi54321:

python代码就像

代码语言:javascript
运行
复制
>>> re.findall(r'[a-zA-Z]+\d{5}\b', x)
['judy88009', 'tommi54321']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26831806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档