使用拆分字符串回复spli

2024-10-03 09:13:35 发布

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

我有多个字符串(>1000)的形式:

\r\nSenor Sisig\nThe Chairman\nCupkates\nLittle Green Cyclo\nSanguchon\nSeoul on Wheels\nKasa Indian\n\nGo Streatery\nWhip Out!\nLiba Falafel\nGrilled Cheese Bandits\r\n

字符串在'\n'之前可能有空白

如何分割这些字符串(以一种有效的方式)以避免得到任何空的或重复的(空白大小写)元素?在

我用的是:

^{pr2}$

编辑: 还有一些例子:

\r\nThe Creme Brulee Cart \r\nCurry Up Now\r\nKoJa Kitchen\r\nAn the Go\r\nPacific Puffs\r\nEbbett's Good to Go\r\nFiveten Burger\r\nGo Streatery\r\nHiyaaa\r\nSAJJ\r\nKinder's Truck\r\nBlue Saigon\r
\r\nThe Chairman\r\nSanguchon\r\nSeoul on Wheels\r\nGo Streatery\r\nStreet Dog Truck\r\nKinder's Truck\r\nYummi BBQ\r\nLexie's Frozen Custard\r\nDrewski's Hot Rod Kitchen\r
\n An the Go \n Cheese Gone Wild \n Cupkates \n Curry Up Now \n Fins on the Hoof\n KoJa Kitchen\n Lobsta Truck \n Oui Chef \n Sanguchon\n Senor Sisig \n The Chairman \n The Rib Whip 

谢谢!在


Tags: the字符串goonwheelskitchencheesengo
3条回答
re.split(r'[\s\n\r]+', str.strip())
>>> s = "\r\nSenor Sisig\nThe Chairman\nCupkates\nLittle Green Cyclo\nSanguchon\nSeoul on Wheels\nKasa Indian\n\nGo Streatery\nWhip Out!\nLiba Falafel\nGrilled Cheese Bandits\r\n"
>>> [x for x in s.strip("\r\n").split("\n") if x]
['Senor Sisig', 'The Chairman', 'Cupkates', 'Little Green Cyclo', 'Sanguchon', 'Seoul on Wheels', 'Kasa Indian', 'Go Streatery', 'Whip Out!', 'Liba Falafel', 'Grilled Cheese Bandits']

如果你坚持使用regex

^{pr2}$

您的示例没有显示任何“在\n之前的空白”,除了一个可选的\r。在

如果这就是您要处理的全部问题,而不是在\r或{}上拆分,而是在一个可能的\r和一个确定的\n上拆分:

re.split(r"\r?\n", s)

当然,这是假设您没有任何没有\r的裸\r来处理。如果您需要平等地处理\r\r\n和{}所有这些(类似于Python的通用换行支持…):

^{pr2}$

或者,更简单地说:

re.split(r"(\r|\n)+", s)

如果要删除前导空格、制表符、多个\r等,可以在regexp中执行此操作,或者在每个结果上调用lstrip

map(str.lstrip, re.split(r"\r|\n", s))

…但这会给你留下空元素。您可以过滤掉这些内容,但最好是在任何以\n结尾的空白处拆分:

re.split(r"\s*\n", s)

这仍然会在开始和结束处留下空元素,因为字符串以换行开始和结束,这就是re.split应该做的事情。如果要消除它们,可以在解析之前strip字符串,也可以在解析后抛出结束值:

re.split(r"\s*\n", s.strip())
re.split(r"\s*\n", s)[1:-1]

我认为最后两个中的一个正是你想要的……但这只是基于你提供的有限信息的猜测。如果没有,那么其中一个(连同它的解释)应该足够让你写出你真正想要的东西。在


从您的新示例中,看起来您真正想要分割的是至少包含一个\n的任何空白。{但是在第二个输入中,{或者在第二个输入中都没有开始},并且在第二个}中没有开始^和第二个}结尾都没有。所以:

re.split(r"\s*\n\s*", s.strip())

但是,在这一点上,可能值得问一下为什么要将它解析为字符串而不是文本文件。假设您是从某个文件或类似文件的对象中获取的,而不是:

with open(path, 'r') as f:
    s = f.read()
    results = re.split(regexpr, s.strip())

…类似这样的东西可能更具可读性,而且速度也快得多(可能不如最优regexp快,但仍然如此之快,以至于任何浪费的字符串处理时间都会被实际的文件读取时间淹没):

with open(path, 'r') as f:
    results = filter(None, map(str.strip, f))

尤其是如果您只想在这个列表上迭代一次,在这种情况下(假设是python3.x,或者使用ifilter和{}来自{}的{}),那么在开始实际工作之前,这个版本不必将整个文件读入内存并进行处理。在

相关问题 更多 >