Python在星号之间提取多个字符串

时间:2012-08-15 18:51:29

标签: python string

我环顾四周,但找不到我要找的东西......

基本上我有一个散落着许多星号的字符串:

示例:red blue green * hello* pink orange 4pgp42g4jg42 * world* violet black

我要做的是将字符串拆分,这样我就可以提取“hello”和“world”,并最终使用for语句将它们打印出来作为列表。我正在使用的字符串更长,并且不一定有我想要取出的任何设定数量的切片。

有人可以帮我解决这个问题吗?

谢谢

7 个答案:

答案 0 :(得分:5)

我希望如此:

re.findall(r'\*([^*]+)\*',string)

会做到这一点。基本上,此正则表达式会查找'*'\*),然后匹配任何非'*'([^*]+))然后另一个'*'的内容。

答案 1 :(得分:3)

作为优秀re建议的替代方案:

使用split分隔“星号之间”和“不在星号之间”的部分:

>>> msg = "red blue green * hello* pink orange 4pgp42g4jg42 * world* violet black"
>>> msg.split()
['red blue green ', ' hello', ' pink orange 4pgp42g4jg42 ', ' world', ' violet black']

然后使用数组切片来获取所有其他部分,从第二部分开始。

>>>msg.split("*")[1::2]
[' hello', ' world']

答案 2 :(得分:1)

你有没有试过re模块?它使用一种称为正则表达式的语法,允许您进行非常复杂的匹配(请参阅文档here)。在你的情况下,你可以尝试这样的事情:

import re

# Store your string
my_str = 'red blue green * hello* pink orange 4pgp42g4jg42 * world* violet black'

# Find matches
match = re.findall(r'\*([^\*]*)\*', my_str)

# Print everything
print match

# Iterate
for item in match:
    print item

答案 3 :(得分:1)

您可以使用.split('*'),然后使用其他所有元素。

例如:

my_string = 'this is a *test* of my code that *I* have written'
split_string = my_string.split('*')
words_between = [split_string[i] for i in range(1, len(split_string), 2)]

答案 4 :(得分:1)

正则表达式似乎有点矫枉过正。我会用:

my_str = 'red blue green * hello* pink orange 4pgp42g4jg42 * world* violet black'
broken_up = my_str.split('*')

如果你不想结束,那就去做吧

broken_up[1:-1]

编辑: 我想我刚刚意识到你真正想要的是什么。从技术上讲,“粉红橙色4pgp42g4jg42”也在星号之间,这是一个问题。我认为这会起作用。

my_str = 'red blue green * hello* pink orange 4pgp42g4jg42 * world* violet black'
broken_up = my_str.split('*')
broken_up = [broken_up[i] for i in range(1, len(broken_up), 2)]

如果你想摆脱空格,只需使用.strip(),如

broken_up = [broken_up[i].strip() for i in range(1, len(broken_up), 2)]

答案 5 :(得分:1)

尝试一下:

from re import findall

sstring = "red blue green * hello* pink orange 4pgp42g4jg42 * world*"

result = findall('\*.*?\*', sstring)
print r

这会给你:

['* hello*', '* world*']

答案 6 :(得分:0)

我会这样做,使用re.split将其分成一个字符串列表:

import re

my_string = "red blue green * hello* pink orange 4pgp42g4jg42 * world* violet black"

all_split_up = re.split('\*', my_string)

执行此操作时,请键入:

for item in all_split_up:
    print item

将产生:

red blue green 
 hello
 pink orange 4pgp42g4jg42 
 world
 violet black

通过使用re.split而不是re.findall,您不必担心在正则表达式模式中指定非捕获组。我认为这是最简单的正则表达式答案,虽然在“答案”按钮上稍晚一点。