假设给出了一个字符串:
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)
,但我没有成功。
我将输出作为列表中包含的整个字符串。
答案 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."""