通过正则表达式拆分字符串

时间:2014-08-01 00:32:32

标签: python regex

假设给出了一个字符串:

input = """
abc@gmail.com is a very nice person
xyz@gmail.com sucks
lol@gmail.com is pretty funny."""

我有一个电子邮件地址的正则表达式:^[A-z0-9\+\.]+\@[A-z0-9\+\.]+\.[A-z0-9\+]+$

目标是根据电子邮件地址正则表达式拆分字符串。 输出应为:

["is a very nice person", "sucks", "is pretty funny."]

我一直在尝试使用re.split(EMAIL_REGEX, input),但我没有成功。 我将输出作为列表中包含的整个字符串。

4 个答案:

答案 0 :(得分:4)

删除^$锚点,因为它们只匹配字符串的开头和结尾。由于电子邮件地址位于字符串的中间,因此它们永远不会匹配。

你的正则表达式有其他问题。帐户名称可以包含许多其他字符,而不是您允许的字符,例如_-。域名可以包含-个字符,但不能包含+。并且您不应该使用范围A-z来获取大写和小写字符,因为您可能不希望包含两个字母块之间的字符(请参阅{{3} });使用A-Za-z或使用a-z并添加flags = re.IGNORECASE

答案 1 :(得分:1)

'^$'可能会将其抛弃。它只匹配以匹配的正则表达式开头和结尾的字符串。

我有一些你想要的东西:

>>> EMAIL_REGEX = r'[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}'
>>> re.split(EMAIL_REGEX, input, flags=re.IGNORECASE)
['\n', ' is a very nice person\n', ' sucks\n', ' is pretty funny.']

答案 2 :(得分:0)

您可能需要遍历这些行,然后使用正则表达式进行拆分。 此外,你的正则表达式最后也不应该有$

尝试类似:

EMAIL_REGEX = r"\.[a-z]{3} " # just for the demo note the space
ends =[]
for L in input.split("\n"):
   parts = re.split(EMAIL_REGEX,L)
   if len(parts) > 1:
       ends.append(parts[1])

输出:

['is a very nice person', 'sucks', 'is pretty funny.']

答案 3 :(得分:0)

这里不会使用正则表达式,它也会像这样工作:

messages = []
for item in input.split('\n'):
    item = ' '.join(item.split(' ')[1:]) #removes everything before the first space, which is just the email-address in this case
    messages.append(item)

使用时输出messages = [] for item in input.split('\n'): item = ' '.join(item.split(' ')[1:]) #removes everything before the first space, which is just the email-address in this case messages.append(item)

messages
input = """
abc@gmail.com is a very nice person
xyz@gmail.com sucks
lol@gmail.com is pretty funny."""

如果你想删除第一个元素,就这样做:input = """ abc@gmail.com is a very nice person xyz@gmail.com sucks lol@gmail.com is pretty funny."""