首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python re子提取不同数据之间的数据

Python re子提取不同数据之间的数据
EN

Stack Overflow用户
提问于 2018-04-12 10:12:52
回答 2查看 61关注 0票数 0

如果我有这个数据

代码语言:javascript
复制
NIST SP 800-53 :: CM-7
NIST SP 800-53A :: CM-7.1 (iii)
NIST SP 800-53 Revision 4 :: CM-7 b
NIST SP 800-53 :: IA-5 (1) (c)
NIST SP 800-53A :: IA-5 (1).1 (v)
NIST SP 800-53 Revision 4 :: IA-5 (1) (c)
NIST SP 800-53 :: IA-7
NIST SP 800-53A :: IA-7.1
NIST SP 800-53 Revision 4 :: IA-7
NIST SP 800-53 :: IA-7
NIST SP 800-53A :: IA-7.1
NIST SP 800-53 Revision 4 :: IA-7
NIST SP 800-53 :: SC-28
NIST SP 800-53A :: SC-28.1
NIST SP 800-53 Revision 4 :: SC-28
NIST SP 800-53 :: SC-23 (3)
NIST SP 800-53A :: SC-23 (3).1 (ii)
NIST SP 800-53 Revision 4 :: SC-23 (3)
NIST SP 800-53 :: SC-3
NIST SP 800-53A :: SC-3.1 (ii)

我只想检索"::“之后的值,不想做其他的事情,使用条带删除空格,如何使用re.sub将空格放入变量中,并在其中打印。

对于像这样的行

代码语言:javascript
复制
NIST SP 800-53 Revision 4 :: IA-5 (1) (c)

我所要做的就是字符串"IA-5“-去掉字符串的第一部分,然后从第一个开括号或空格开始?我必须说明没有括号的行,就像下面这行:

代码语言:javascript
复制
NIST SP 800-53 Revision 4 :: CM-7 b

我只需要子字符串"CM-7“,不需要其他内容。

EN

回答 2

Stack Overflow用户

发布于 2018-04-12 10:17:15

使用re.findall而不是re.sub

代码语言:javascript
复制
import re
data = list(filter(None, input.split('\n')))
last_data = [re.findall('(?<=::\s)[a-zA-Z]+\-[\d\.]+', i)[0] for i in data]

输出:

代码语言:javascript
复制
['CM-7', 'CM-7.1', 'CM-7', 'IA-5', 'IA-5', 'IA-5', 'IA-7', 'IA-7.1', 'IA-7', 'IA-7', 'IA-7.1', 'IA-7', 'SC-28', 'SC-28.1', 'SC-28', 'SC-23', 'SC-23', 'SC-23', 'SC-3', 'SC-3.1']
票数 0
EN

Stack Overflow用户

发布于 2018-04-12 10:19:48

[re.sub('.*?::\s*(\S*)\s.*', '\g<1>', line, flags=re.DOTALL) for line in data]将工作得很好:)

我是捕获组子集的铁杆粉丝。

( re.DOTALL将处理行尾的繁琐空格)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49786931

复制
相关文章

相似问题

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