我环顾四周,但找不到我要找的东西......
基本上我有一个散落着许多星号的字符串:
示例:red blue green * hello* pink orange 4pgp42g4jg42 * world* violet black
我要做的是将字符串拆分,这样我就可以提取“hello”和“world”,并最终使用for语句将它们打印出来作为列表。我正在使用的字符串更长,并且不一定有我想要取出的任何设定数量的切片。
有人可以帮我解决这个问题吗?
谢谢
答案 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,您不必担心在正则表达式模式中指定非捕获组。我认为这是最简单的正则表达式答案,虽然在“答案”按钮上稍晚一点。