如何使用regex在单词组合之后和下一个空格之前找到有单词和非单词字符的模式

2024-06-26 13:52:12 发布

您现在位置:Python中文网/ 问答频道 /正文

输入文本

str_ = '''abc xyz pq m_www.google.in_10 -name itel.google.in
abc xyz pq I_www.google.in_9 -name itel.google.com
abc xyz pq I_www.google.in_8 
abc xyz pq I.www_google.com_10 -name itel_google.com_9'''

需要提取“abc xyz pq”后面的组合,直到下一个空格。此组合框可以包含\w点(&D)。还要提取'-name'后面的组合。这两个组合应该是一个列表

预期输出(作为列表)

'[['m_www.google.in_10', 'itel.google.in']
['I_www.google.in_9', 'itel.google.com']
['I_www.google.in_8', '']
['I_www.google.com_10', 'itel.google.com_9']]'

我的伪代码

import re
re.findall(r'abc xyz pq (\w+)\.(\w+)\.(\w+) -name? (\w+?)\.(\w+?)\.(\w+?)',str_ )

Tags: 代码namein文本recom列表www
2条回答

您可以在re.findall中使用此正则表达式:

>>> for i in re.findall(r'abc xyz pq\s+([\w.]+)(?:\s+-name\s+([\w.]+))?', str_):
...     print (i)
...
('m_www.google.in_10', 'itel.google.in')
('I_www.google.in_9', 'itel.google.com')
('I_www.google.in_8', '')
('I.www_google.com_10', 'itel_google.com_9')

请注意,该列表与预期的数据结构不匹配,但您可以迭代此列表并创建自定义结构。你知道吗

或者您可以使用re.finditer并准备您的自定义列表。你知道吗

具有特定正则表达式模式:

import re

s = '''abc xyz pq m_www.google.in_10 -name itel.google.in
abc xyz pq I_www.google.in_9 -name itel.google.com
abc xyz pq I_www.google.in_8 
abc xyz pq I.www_google.com_10 -name itel_google.com_9'''

res = list(map(list, re.findall(r'\babc xyz pq (\w+[.\w]+)(?: -name (\w+[.\w]+))?', s)))
pprint(res)

预期输出(列表列表):

[['m_www.google.in_10', 'itel.google.in'],
 ['I_www.google.in_9', 'itel.google.com'],
 ['I_www.google.in_8', ''],
 ['I.www_google.com_10', 'itel_google.com_9']]

正则表达式模式详细信息:

  • \b-单词边界

  • (\w+[.\w]+)-捕获单词字符\w+,后跟.字符或单词字符序列[.\w]+

  • (?: ...)-将组标记为非捕获,但在上面的情况下,它包含另一个捕获的组(内部组)
  • (...)?-将组标记为可选?量词匹配在0到1倍之间)

相关问题 更多 >