如何拆分字符串并保持模式

时间:2016-05-18 19:00:44

标签: python

这就是字符串拆分现在对我有用的方法:

highlightjs

但我想知道是否有更多的pythonic方法可以做到。

目标是在'} / n}'之前获取所有内容,包括'} / n}'

4 个答案:

答案 0 :(得分:1)

这可能是对str.partition的好用。

Select DISTINCT
 so.num AS Ref
, so.shiptoname AS Recipient_Full_Name
, so.shiptoaddress AS Address_1
, so.shiptocity AS City
, stateconst.name AS State
, so.shiptozip AS Zip
, so.billtoname AS Buyer_Name
, contact.datus AS Buyer_Email
, qbclass.name AS Class
, carrier.name AS Carrier
, CAST(soitem.datescheduledfulfillment as date) AS Fulfillment_Date
From SO
JOIN stateconst
ON so.shiptostateid=stateconst.id
JOIN qbclass
ON so.qbclassid=qbclass.id
JOIN soitem
ON so.id=soitem.soid
JOIN carrier
ON so.carrierid=carrier.id
JOIN contact
ON so.customerid=customer.id
ON customer.accountid=contact.accountid
WHERE CAST(soitem.datescheduledfulfillment as date) = '5/16/16'
AND qbclass.name<>'C- Online' AND qbclass.name<>'InterCompany'

或者,您可以使用str.index明确找到它。

string = '012za}/n}ddfsdfk'

parts = string.partition('}/n}')
# ('012za', '}/n}', 'ddfsdfk')

''.join(parts[:-1])
# 012za}/n}

这可能比使用str.find更好,因为如果找不到子字符串会引发异常,而不是产生无意义的结果。

似乎任何“更优雅”都需要正则表达式。

repl = '}/n}'

string[:string.index(repl) + len(repl)]
# 012za}/n}

答案 1 :(得分:0)

可以使用re.split()完成 - 关键是在分割模式周围放置parens以保留您分割的内容:

import re

output = "".join(re.split(r'(}/n})', string.encode('UTF8'))[:2])

然而,我怀疑这是实现你想要的最有效也是最恐怖的方式。即我不认为这自然是一个拆分类问题。例如:

tag = '}/n}'

encoded = string.encode('UTF8')

output = encoded[:encoded.index(tag)] + tag

或者如果你坚持单行:

output = (lambda string, tag: string[:string.index(tag)] + tag)(string.encode('UTF8'), '}/n}')

或返回正则表达式:

output = re.match(r".*}/n}", string.encode('UTF8')).group(0)

答案 2 :(得分:0)

>>> string_to_split = 'first item{\n{second item'
>>> sep = '{\n{'
>>> output = [item + sep for item in string_to_split.split(sep)]
NOTE: output = ['first item{\n{', 'second item{\n{']

然后你可以使用结果:

for item_with_delimiter in output:
    ...

如果您不确定行结尾是什么,查找os.linesep可能会有用。 os.linesep是您当前操作系统下的行结尾,因此Windows下的'\r\n'或Linux或Mac下的'\n'。这取决于输入数据来自何处,以及您的代码在整个环境中的灵活程度。

答案 3 :(得分:-1)

改编自Slice a string after a certain phrase?,您可以结合使用find和slice来获取字符串的第一部分并保留}/n}

str = "012za}/n}ddfsdfk"
str[:str.find("}/n}")+4]

将导致012za}/n}