Python 从字符串中获取数据的正则表达式
Python Regular Expression to fetch data from string
我正在编写我的第一个 Python 重新代码,我对正则表达式有一些疑问。
我有一个包含
的变量
a = "'PoE Port Info','1 up medium Auto Class Searching 0 0.0 0 0.0','10 up low User defined 4(W) Searching - 0.0 0 0.0'"
我需要提取:
'1 up medium Auto Class Searching 0 0.0 0 0.0'
并将字符串转换为删除所有空格的字符串列表
['1','up','medium','Auto Class','Searching','0','0.0','0','0.0']
同样
'10 up low User defined 4(W) Searching - 0.0 0 0.0'
删除空格并转换为列表
['10','up','low','User defined,'4(W)','Searching','-','0.0','0','0.0']
该字符串中的所有其他剩余数据不应匹配。
我的代码:
a = "'PoE Port Info','1 up medium Auto Class Searching 0 0.0 0 0.0','10 up low User defined 4(W) Searching - 0.0 0 0.0'"
b= []
#split string with ,
a = a.split(",")
print(a)
for item in a:
c = re.findall(r"[0-9]+[\s+[a-z]+]*[0-9]+",item, re.I)
if c:
#Replace whitespace character to spaces
temp = re.sub(r'[\s]+',' ', c[0])
#print(temp)
b.append(temp.split(" "))
print(b)
此代码有效,但我在正则表达式方面遇到问题。
我当前的输出:
[['1', 'up', 'medium', 'Auto', 'Class', 'Searching', '0'], ['10', 'up', 'low', 'User', 'defined', '4']]
有的请帮帮我
RE怎么写?
我建议您使用像 regex 101 这样的在线正则表达式编辑器并在那里测试您的测试字符串 - 在那里创建有效语法要容易得多,并且在匹配信息中 window 您还可以看到哪个组是什么。
我可能会尝试创建一组 x 组(一个对应您需要的每个值)。之后不需要拆分等操作。
如果您知道不需要检查 nested/escaped 单引号,您可以简单地使用单个正则表达式提取所有字段,该正则表达式将一次性捕获所有字段。问题在于第四个字段可能包含任何(数量)字符,因此您需要拼出其他字段的模式。
这是一个正则表达式示例:
import re
a = "'PoE Port Info','1 up medium Auto Class Searching 0 0.0 0 0.0','10 up low User defined 4(W) Searching - 0.0 0 0.0'"
res = re.findall(r"(?!^)'(\d+)\s+(\w+)\s+(\w+)\s+([^']*?)\s+(\S+)\s+(\S+)\s+([\d.]+)\s+(\d+)\s+([\d.]+)'", a)
print(res)
# => [
# ('1', 'up', 'medium', 'Auto Class', 'Searching', '0', '0.0', '0', '0.0'),
# ('10', 'up', 'low', 'User defined 4(W)', 'Searching', '-', '0.0', '0', '0.0')
# ]
见regex demo and the Python demo
详情
(?!^)'
- '
不在字符串的开头
(\d+)
- 第 1 组:一个或多个数字
\s+
- 1+ 个空格
(\w+)\s+
- 第 2 组:一个或多个单词字符,然后是 1+ 个空格
(\w+)\s+
- 第 3 组:一个或多个单词字符,然后是 1+ 个空格
([^']*?)\s+
- 第 4 组:除 '
之外的任何 0 个或更多字符尽可能少,然后是 1+ 个空格
(\S+)\s+
- 第 5 组:任何 1+ 个非空格,然后是 1+ 个空格
(\S+)\s+
- 第 6 组:任何 1+ 个非空格,然后是 1+ 个空格
([\d.]+)\s+
- 第 7 组:任意 1+ digits/dots,然后是 1+ 空格
(\d+)\s+
- 第 8 组:任意 1 个以上的数字,然后是 1 个以上的空格
([\d.]+)
- 第 9 组:任意 1+ digits/dots
'
- '
个字符。
我正在编写我的第一个 Python 重新代码,我对正则表达式有一些疑问。 我有一个包含
的变量a = "'PoE Port Info','1 up medium Auto Class Searching 0 0.0 0 0.0','10 up low User defined 4(W) Searching - 0.0 0 0.0'"
我需要提取:
'1 up medium Auto Class Searching 0 0.0 0 0.0'
并将字符串转换为删除所有空格的字符串列表
['1','up','medium','Auto Class','Searching','0','0.0','0','0.0']
同样
'10 up low User defined 4(W) Searching - 0.0 0 0.0'
删除空格并转换为列表
['10','up','low','User defined,'4(W)','Searching','-','0.0','0','0.0']
该字符串中的所有其他剩余数据不应匹配。
我的代码:
a = "'PoE Port Info','1 up medium Auto Class Searching 0 0.0 0 0.0','10 up low User defined 4(W) Searching - 0.0 0 0.0'"
b= []
#split string with ,
a = a.split(",")
print(a)
for item in a:
c = re.findall(r"[0-9]+[\s+[a-z]+]*[0-9]+",item, re.I)
if c:
#Replace whitespace character to spaces
temp = re.sub(r'[\s]+',' ', c[0])
#print(temp)
b.append(temp.split(" "))
print(b)
此代码有效,但我在正则表达式方面遇到问题。 我当前的输出:
[['1', 'up', 'medium', 'Auto', 'Class', 'Searching', '0'], ['10', 'up', 'low', 'User', 'defined', '4']]
有的请帮帮我
RE怎么写?
我建议您使用像 regex 101 这样的在线正则表达式编辑器并在那里测试您的测试字符串 - 在那里创建有效语法要容易得多,并且在匹配信息中 window 您还可以看到哪个组是什么。
我可能会尝试创建一组 x 组(一个对应您需要的每个值)。之后不需要拆分等操作。
如果您知道不需要检查 nested/escaped 单引号,您可以简单地使用单个正则表达式提取所有字段,该正则表达式将一次性捕获所有字段。问题在于第四个字段可能包含任何(数量)字符,因此您需要拼出其他字段的模式。
这是一个正则表达式示例:
import re
a = "'PoE Port Info','1 up medium Auto Class Searching 0 0.0 0 0.0','10 up low User defined 4(W) Searching - 0.0 0 0.0'"
res = re.findall(r"(?!^)'(\d+)\s+(\w+)\s+(\w+)\s+([^']*?)\s+(\S+)\s+(\S+)\s+([\d.]+)\s+(\d+)\s+([\d.]+)'", a)
print(res)
# => [
# ('1', 'up', 'medium', 'Auto Class', 'Searching', '0', '0.0', '0', '0.0'),
# ('10', 'up', 'low', 'User defined 4(W)', 'Searching', '-', '0.0', '0', '0.0')
# ]
见regex demo and the Python demo
详情
(?!^)'
-'
不在字符串的开头(\d+)
- 第 1 组:一个或多个数字\s+
- 1+ 个空格(\w+)\s+
- 第 2 组:一个或多个单词字符,然后是 1+ 个空格(\w+)\s+
- 第 3 组:一个或多个单词字符,然后是 1+ 个空格([^']*?)\s+
- 第 4 组:除'
之外的任何 0 个或更多字符尽可能少,然后是 1+ 个空格(\S+)\s+
- 第 5 组:任何 1+ 个非空格,然后是 1+ 个空格(\S+)\s+
- 第 6 组:任何 1+ 个非空格,然后是 1+ 个空格([\d.]+)\s+
- 第 7 组:任意 1+ digits/dots,然后是 1+ 空格(\d+)\s+
- 第 8 组:任意 1 个以上的数字,然后是 1 个以上的空格([\d.]+)
- 第 9 组:任意 1+ digits/dots'
-'
个字符。