如何在python中构建一个可以匹配以下所有内容的正则表达式? 其中它是一个“字符串(a-zA-Z)”后跟一个空格后跟1或多个4个整数,用逗号分隔:
例:
someotherstring 42 1 48 17,
somestring 363 1 46 17,363 1 34 17,401 3 8 14,
otherstring 42 1 48 17,363 1 34 17,
我尝试了以下内容,因为我需要知道每个整数:
myRE=re.compile("(\s+) ((\d+) (\d+) (\d+) (\d+),)+"
但是我怎样才能知道我有多少4个整数?我该如何处理它们?
谢谢。
答案 0 :(得分:1)
>>> test = "somestring 363 1 46 17,363 1 34 17,401 3 8 14,"
这是输入字符串的pyparsing处理器:
>>> from pyparsing import *
>>> integer = Word(nums)
>>> patt = Word(alphas) + OneOrMore(Group(integer*4 + Suppress(',')))
使用patt.parseString返回一个pyparsing ParseResults对象,它有一些很好的list / dict / object属性。首先,只需将结果打印出来作为列表:
>>> patt.parseString(test).asList()
['somestring', ['363', '1', '46', '17'], ['363', '1', '34', '17'], ['401', '3', '8', '14']]
了解每个群组如何分组为子列表?
现在让我们让解析器为我们做更多的工作。在解析时,我们已经知道我们正在解析有效整数 - 匹配Word(nums)
的任何东西都必须是整数。因此,我们可以添加一个解析操作来在解析时执行此转换:
>>> integer = Word(nums).setParseAction(lambda tokens:int(tokens[0]))
现在,我们重新创建我们的模式,现在解析为我们提供了一组数字:
>>> patt = Word(alphas) + OneOrMore(Group(integer*4 + Suppress(',')))
>>> patt.parseString(test).asList()
['somestring', [363, 1, 46, 17], [363, 1, 34, 17], [401, 3, 8, 14]]
最后,我们还可以为从此输入解析出的位分配名称:
>>> patt = Word(alphas)("desc") + OneOrMore(Group(integer*4 + Suppress(',')))("numgroups")
退回商品的清单是相同的:
>>> patt.parseString(test).asList()
['somestring', [363, 1, 46, 17], [363, 1, 34, 17], [401, 3, 8, 14]]
但是如果我们转储()结果,我们会看到我们可以通过名称访问的内容:
>>> print patt.parseString(test).dump()
['somestring', [363, 1, 46, 17], [363, 1, 34, 17], [401, 3, 8, 14]]
- desc: somestring
- numgroups: [[363, 1, 46, 17], [363, 1, 34, 17], [401, 3, 8, 14]]
我们可以将这些名称用于类似dict或类似属性的访问。我自己偏爱属性样式:
>>> res = patt.parseString(test)
>>> print res.desc
somestring
>>> print res.numgroups
[[363, 1, 46, 17], [363, 1, 34, 17], [401, 3, 8, 14]]
>>> for ng in res.numgroups: print sum(ng)
...
427
415
426
这是整个解析器和输出处理器:
test = "somestring 363 1 46 17,363 1 34 17,401 3 8 14,"
from pyparsing import *
integer = Word(nums).setParseAction(lambda tokens:int(tokens[0]))
patt = Word(alphas)("desc") + \
OneOrMore(Group(integer*4 + Suppress(',')))("numgroups")
print patt.parseString(test).asList()
print patt.parseString(test).dump()
res = patt.parseString(test)
print res.desc
print res.numgroups
for ng in res.numgroups:
print sum(ng)
答案 1 :(得分:0)
由于您的数据单元(我上面称之为)由逗号和空格分隔,您仍然可以使用split
:)
data = "someotherstring 42 1 48 17, somestring 363 1 46 17,363 1 34 17,401 3 8 14, otherstring 42 1 48 17,363 1 34 17"
data_items = data.split(', ')
for item in data_items:
section_title, intdata = item.split(' ', 1)
print 'Processing %s' % section_title
for ints in intdata.split(','):
a, b, c, d = [int(x) for x in ints.split()]
# do your stuff ...
答案 2 :(得分:0)
import re
str_in = "someotherstring 42 1 48 17, somestring 363 1 46 17,363 1 34 17,401 3 8 14, otherstring 42 1 48 17,363 1 34 17,"
list_out = re.split("[\\s,]", str_in)
然后 list_out
包含一个列表,其中每个部分的名称后跟所有整数(仍然是字符串),然后是空白条目(用于分隔部分),依此类推:
['someotherstring', '42', '1', '48', '17', '', 'somestring', '363', '1', '46', '17', '363', '1', '34', '17', '401', '3', '8', '14', '', 'otherstring', '42', '1', '48', '17', '363', '1', '34', '17', '']