我有以下字符串
Date: 20/8/2020 Duration: 0.33 IP: 110.1.x.x Server:01
我正在应用findall作为拆分字符串的一种方式,当我应用findall时,它会拆分I & P我如何更改表达式以获得此输出第一次
findall
toiithl61#
查找以两个大写字母开头或一个大写字母后跟一个小写字母开头的任何字符串,然后进行匹配,直到找到相同的模式或行尾为止。
>>> re.findall(r'([A-Z][a-zA-Z].*?)\s*(?=[A-Z][a-zA-Z]|$)', text) ['Date: 20/8/2020', 'Duration: 0.33', 'IP: 110.1.x.x', 'Server:01']
您可能还希望使用此功能创建词典。
>>> dict(re.split(r'\s*:\s*', m, 1) for m in re.findall(r'([A-Z][a-zA -Z].*?)\s*(?=[A-Z][a-zA-Z]|$)', text)) {'Date': '20/8/2020', 'Duration': '0.33', 'IP': '110.1.x.x', 'Server': '01'}
3yhwsihp2#
使用正则表达式,你应该总是尽可能精确。所以如果你知道你的输入数据总是这样,我建议用正则表达式写完整的单词。如果这不是你想要的,你必须牺牲确定性:1.更改Regex以接受在任何位置包含任何大小的字母的任何单词1.将大写字母P添加为以下字母1.将IP添加为特殊情况
5cg8jx4n3#
您可以用途:
(?<!\S)[A-Z][a-zA-Z]*:\s*\S+
说明
(?<!\S)
[A-Z][a-zA-Z]*:
:
\s*\S
Regex demo
import re pattern = r"(?<!\S)[A-Z][a-zA-Z]*:\s*\S+" s = "Date: 20/8/2020 Duration: 0.33 IP: 110.1.x.x Server:01" print(re.findall(pattern, s))
输出量
['Date: 20/8/2020', 'Duration: 0.33', 'IP: 110.1.x.x', 'Server:01']
3条答案
按热度按时间toiithl61#
查找以两个大写字母开头或一个大写字母后跟一个小写字母开头的任何字符串,然后进行匹配,直到找到相同的模式或行尾为止。
您可能还希望使用此功能创建词典。
3yhwsihp2#
使用正则表达式,你应该总是尽可能精确。所以如果你知道你的输入数据总是这样,我建议用正则表达式写完整的单词。
如果这不是你想要的,你必须牺牲确定性:
1.更改Regex以接受在任何位置包含任何大小的字母的任何单词
1.将大写字母P添加为以下字母
1.将IP添加为特殊情况
5cg8jx4n3#
您可以用途:
说明
(?<!\S)
[A-Z][a-zA-Z]*:
匹配大写字符A-Z,可选字符a-zA-Z,后跟:
\s*\S
匹配可选的空白字符和1+个非空白字符Regex demo
输出量