在Python中解析和切分长字符串

2024-06-28 19:25:50 发布

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

我已经找过了,但没有找到适合我这个案子的东西。基本上,我试着把以下几行分开:

(CU!DIVD:WEXP:DIVD-:DIVD+:RWEXP:RDIVD:RECL:RLOSS:MISCDI:WEXP-:INT:RGAIN:DIVOP:RRGAIN:DIVOP-:RDIVOP:RRECL:RBRECL:INT -:RRLOSS:INT +:RINT:RDIVD-:RECL-:RWXPOR:WEXPOR:MISCRE:WEXP+:RWEXP-:RBWEXP:RECL+:RRECL-:RBDIVD)

你可以读这个,因为CU不是DIVD或WEXP或DIV-or等等。如果这行超过65个字符,我想把这行拆分成更易于管理的内容,比如:

^{pr2}$

他们都不到65个字符。这个可以存储在一个列表中,剩下的我来处理。我开始用RegEx来处理这个问题,但是我遇到了一些麻烦。在

此外,它还可以具有以下条件:

  • 啊!在
  • <
  • >
  • =
  • 啊!=
  • 啊!<
  • 啊!>

到目前为止,我有这个:

def FilterParser(iteratorIn, headerIn):
    listOfStrings = []
    for eachItem in iteratorIn:
        if len(str(eachItem.text)) > 65:
             exmlLogger.error('The length of filter' + eachItem.text + ' exceeds the limit and will be dropped')
             pass
        else:
            listOfStrings.append(rightSpaceFill(headerIn + EXUTIL.intToString(eachItem),80))
return ''.join(stringArray)

Tags: ltgtint个字符curecleachitemheaderin
1条回答
网友
1楼 · 发布于 2024-06-28 19:25:50

下面是一个使用regex的解决方案,经过编辑后在每一新行的开头包含CU!前缀(或任何其他前缀):

import re
s = '(CU!DIVD:WEXP:DIVD-:DIVD+:RWEXP:RDIVD:RECL:RLOSS:MISCDI:WEXP-:INT:RGAIN:DIVOP:RRGAIN:DIVOP-:RDIVOP:RRECL:RBRECL:INT -:RRLOSS:INT +:RINT:RDIVD-:RECL-:RWXPOR:WEXPOR:MISCRE:WEXP+:RWEXP-:RBWEXP:RECL+:RRECL-:RBDIVD)'

prefix = '(' + re.search(r'\w+(!?[=<>]|!)', s).group(0)
maxlen = 64 - len(prefix)  # max line length of 65, prefix and ')' will be added
regex = re.compile(r'(.{1,%d})(?:$|:)' % maxlen)
lines = [prefix + line + ')' for line in regex.findall(s[len(prefix):-1])]

>>> print '\n'.join(lines)
(CU!DIVD:WEXP:DIVD-:DIVD+:RWEXP:RDIVD:RECL:RLOSS:MISCDI:WEXP-)
(CU!INT:RGAIN:DIVOP:RRGAIN:DIVOP-:RDIVOP:RRECL:RBRECL:INT -)
(CU!RRLOSS:INT +:RINT:RDIVD-:RECL-:RWXPOR:WEXPOR:MISCRE:WEXP+)
(CU!RWEXP-:RBWEXP:RECL+:RRECL-:RBDIVD)

首先,我们需要获取前缀,我们使用re.search().group(0),它返回整个匹配。最后一行最多应该是65个字符,我们将用来获取这些行的正则表达式将不包括前缀或右括号,这就是为什么maxlen是{}。在

现在我们知道了可以匹配的大多数字符,regex (.{1,<maxlen>)的第一部分最多可以匹配这么多个字符。结尾的部分(?:$|:),用于确保我们只在分号或字符串末尾拆分字符串。因为只有一个捕获组regex.findall()将只返回匹配项,去掉后面的分号。下面是示例字符串的外观:

^{pr2}$

列表理解通过在每个结果中添加前缀和尾随)来构造所有行的列表。对s进行切片,这样前缀和尾随的{}将从regex.findall()之前的原始字符串中剥离出来。希望这有帮助!在

相关问题 更多 >