首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当有多个分隔符或没有分隔符时,拆分字符串(数字表示单位)

当有多个分隔符或没有分隔符时,拆分字符串(数字表示单位)
EN

Stack Overflow用户
提问于 2020-01-28 00:49:23
回答 2查看 33关注 0票数 0

我有一组数据,看起来像这样:

代码语言:javascript
复制
 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,对他们中的一些人来说效果不错,但对另一些人来说就不好了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-28 01:30:22

看看我创建的正则表达式:https://regexr.com/4t199

它对您给出的所有不同类型的线路使用命名捕获组。然后,您可以检查字典中每个部分的存在。

代码语言:javascript
复制
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')

它会打印类似下面这样的内容:

代码语言:javascript
复制
 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}

你可以根据你想做的任何事情来解析输出。

票数 2
EN

Stack Overflow用户

发布于 2020-01-28 01:29:37

我不知道您想要如何处理左边的部分,但是将单元与其余部分分开是可以管理的,但是您需要清理这条线。

代码语言:javascript
复制
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')

输出:

代码语言:javascript
复制
('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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59935510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档