我有一组数据,看起来像这样:
0.1 - 1000 dB/s
>45 dB
30 pm
+/- 0.3 %
10 - 100 %
5 - 20 mW
10 - 62 Watts
-40 - 85 C
0.640 or 0.810 um
0.640 or 0.810 um
20
15首先是一些数字,也可以包含"+“、”-“和单位。数字和单位之间的分隔符可以是一个或多个空格,不间断空格(当它们是范围时,它们也可以出现在数字之间)。也有没有单位的数字。
我想分开,这里是大小写,单位的号码。我试着通过文本来使用split,对他们中的一些人来说效果不错,但对另一些人来说就不好了。
发布于 2020-01-28 01:30:22
看看我创建的正则表达式:https://regexr.com/4t199
它对您给出的所有不同类型的线路使用命名捕获组。然后,您可以检查字典中每个部分的存在。
import re
p = re.compile('^(\s+)?(?P<sym>([\>\<]|\+\/\-|\-)\s*)?(?P<num>(\d+(\.\d+)?))((?P<orsec> (\-|or) )?(?P<num2>\d+(\.\d+)?)?)?\s*(?P<unit>[a-zA-Z\%\/]+)?$')
text = '''
0.1 - 1000 dB/s
>45 dB
30 pm
+/- 0.3 %
10 - 100 %
5 - 20 mW
10 - 62 Watts
-40 - 85 C
0.640 or 0.810 um
0.640 or 0.810 um
20
15
'''
for line in text.split('\n'):
if line.strip():
m = p.match(line)
if m:
print(f'{line:40} => {m.groupdict()}')
else:
print(f'{line:40} => no match')它会打印类似下面这样的内容:
0.1 - 1000 dB/s => {'sym': None, 'num': '0.1', 'orsec': ' - ', 'num2': '1000', 'unit': 'dB/s'}
>45 dB => {'sym': '>', 'num': '45', 'orsec': None, 'num2': None, 'unit': 'dB'}
30 pm => {'sym': None, 'num': '30', 'orsec': None, 'num2': None, 'unit': 'pm'}
+/- 0.3 % => {'sym': '+/- ', 'num': '0.3', 'orsec': None, 'num2': None, 'unit': '%'}
10 - 100 % => {'sym': None, 'num': '10', 'orsec': ' - ', 'num2': '100', 'unit': '%'}
5 - 20 mW => {'sym': None, 'num': '5', 'orsec': ' - ', 'num2': '20', 'unit': 'mW'}
10 - 62 Watts => {'sym': None, 'num': '10', 'orsec': ' - ', 'num2': '62', 'unit': 'Watts'}
-40 - 85 C => {'sym': '-', 'num': '40', 'orsec': ' - ', 'num2': '85', 'unit': 'C'}
0.640 or 0.810 um => {'sym': None, 'num': '0.640', 'orsec': ' or ', 'num2': '0.810', 'unit': 'um'}
0.640 or 0.810 um => {'sym': None, 'num': '0.640', 'orsec': ' or ', 'num2': '0.810', 'unit': 'um'}
20 => {'sym': None, 'num': '20', 'orsec': None, 'num2': None, 'unit': None}
15 => {'sym': None, 'num': '15', 'orsec': None, 'num2': None, 'unit': None}你可以根据你想做的任何事情来解析输出。
发布于 2020-01-28 01:29:37
我不知道您想要如何处理左边的部分,但是将单元与其余部分分开是可以管理的,但是您需要清理这条线。
import re
REMOVE_SPACES = re.compile(r'( {2,})') # Matches 2 or more spaces.
lines = []
with open('data.txt') as f:
for line in f:
line = line.strip() # remove leading and trailing spaces
line = REMOVE_SPACES.sub(' ', line) # Replaces more than one space with a single space
chunks = line.split(' ') # Split on spaces
if len(chunks) == 1: # If only one chunk then it has no unit.
lines.append((chunks[0], None))
else:
lines.append((' '.join(chunks[:-1]), chunks[-1])) # Else append the value and the unit
print(*lines, sep='\r\n')输出:
('0.1 - 1000', 'dB/s')
('>45', 'dB')
('30', 'pm')
('+/- 0.3', '%')
('10 - 100', '%')
('5 - 20', 'mW')
('10 - 62', 'Watts')
('-40 - 85', 'C')
('0.640 or 0.810', 'um')
('0.640 or 0.810', 'um')
('20', None)
('15', None)https://stackoverflow.com/questions/59935510
复制相似问题