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
  • ' - ' 个字符。