使用PyParsing匹配2个以上的空格

2024-09-29 21:53:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个像下面这样的字符串:

date                Not Important                         value    NotImportant2
11.11.13            useless . useless,21 useless 2        14.21    asmdakldm
21.12.12            fmpaosmfpoamsp 4                      41       ajfa9si90

我只需要提取日期和末尾的值。在

如果我使用标准过程匹配多个单词,pyparsing会将最后一个“Not Important”列作为“value”进行匹配。在

^{pr2}$

我认为最好的方法是强制pyparsing至少匹配2个空格,但我真的不知道如何匹配。有什么建议吗?在


Tags: 字符串标准datevalue过程notpyparsing单词
2条回答

说明

要匹配2个或更多空格,可以使用\s{2,}

此表达式将:

  • 捕获日期字段
  • 捕获倒数第二个字段

^(\d{2}\.\d{2}\.\d{2})[^\r\n]*\s(\S+)\s{2,}\S+\s*(?:[\r\n]|\Z)

enter image description here

示例

Live Demo

示例文本

date                Not Important                         value    NotImportant2
11.11.13            useless . useless,21 useless 2        14.21    asmdakldm
21.12.12            fmpaosmfpoamsp 4                      41       ajfa9si90

匹配

^{pr2}$

这个示例文本是列式的,所以pyparsing在这里有点过分了。 你可以写下:

fieldslices = [slice(0,8), # dateslice
               slice(58,58+8), # valueslice
              ]

for line in sample:
    date,value = (line[x] for x in fieldslices)
    print date,value.strip()

然后得到:

^{pr2}$

但是,由于您特别需要pyparsing解决方案,那么对于如此具有专栏性的东西,您可以使用GoToColumn类:

^{3}$

GoToColumnSkipTo相似,但它不是前进到表达式的下一个实例,而是前进到特定的列号(其中列号是从1开始的,而不是像字符串切片那样从0开始的)。在

下面是应用于示例文本的解析器:

# Normally, input would be from some text file
# infile = open(sourcefile)
# but for this example, create iterator from the sample 
# text instead
sample = """\
date                Not Important                         value    NotImportant2
11.11.13            useless . useless,21 useless 2        14.21    asmdakldm
21.12.12            fmpaosmfpoamsp 4                      41       ajfa9si90
""".splitlines()

infile = iter(sample)

# skip header line
next(infile) 

for line in infile:
    result = patt.parseString(line)
    print result.dump()
    print

印刷品:

['11.11.13', 'useless . useless,21 useless 2        ', 14.210000000000001]
- date: 11.11.13
- value: 14.21

['21.12.12', 'fmpaosmfpoamsp 4                      ', 41]
- date: 21.12.12
- value: 41

请注意,这些值已经从string转换为int或float类型;您可以为自己编写一个解析操作,将dd.mm.yy日期转换为Python日期时间。还要注意关联的结果名称是如何定义的;这些名称允许您按名称访问各个字段,如print result.date。在

我还注意到您的假设,即要获得一个或多个元素的序列,您使用了以下构造:

anything = pp.Forward()
anything << anyword + (value | anything)

虽然这样做是可行的,但它会创建一个运行时代价高昂的递归表达式。pyparsing提供了一个迭代等价物OneOrMore

anything = OneOrMore(anyword)

或者,如果您喜欢较新的“*”运算符形式:

^{8}$

请扫描pyparsing API文档,这些文档包含在pyparsing的源代码发行版中,或者在线访问http://packages.python.org/pyparsing/。在

欢迎使用Pyparsing!在

相关问题 更多 >

    热门问题