在Python中使用纯正则表达式方法

在Python中使用纯正则表达式方法,python,python-3.x,regex,Python,Python 3.x,Regex,我有一篇包含 text = """Dave 2008-09-20 2020-05-31 dave@google.com Steve 2009-01-23 2020-04-30 steve@gmail.com Rob 2007-02-14 2020-04-30 rob@gmail.com Ryan 2010-02-11 2020-03-10 ryan@yahoo.com """ 我需要将其更改为两种形式: 第一: 第二: [('D

我有一篇包含

text = """Dave 2008-09-20 2020-05-31 dave@google.com
Steve 2009-01-23 2020-04-30 steve@gmail.com 
Rob 2007-02-14 2020-04-30 rob@gmail.com 
Ryan 2010-02-11 2020-03-10 ryan@yahoo.com 
"""
我需要将其更改为两种形式: 第一:

第二:

[('Dave', '2008-09-20', '2020-05-31', 'dave@google.com'),
 ('Steve', '2009-01-23', '2020-04-30', 'steve@gmail.com'),
 ('Rob', '2007-02-14', '2020-04-30', 'rob@gmail.com'),
 ('Ryan', '2010-02-11', '2020-03-10', 'ryan@yahoo.com')]

我得到了所有的结果:- 但这肯定不是纯粹的正则表达式用法

首先,我使用

splB = re.split(r'\n+',text.strip())
splB
test = [x for x in splB]
test
第二,我使用:

splC = [(tuple)(re.split(' ',x.strip())) for x in re.split(r'\n',text.strip())] 
splC
两者都得到相同的结果,但我想使用正则表达式作为我的方法。。
如果可能的话,我不想使用类似list.split()的东西,但只使用正则表达式和正则表达式。

请记住,除非这只是为了练习,否则这里不需要使用
regex
<在这种情况下,code>str.split将更简单。如果这只是为了练习
regex
,那么这将对您有用:

splt = [s.strip() for s in re.split(r"\n(?=\w)", text)] # your "first form"
formatted = [] # your "second form"
for s in splt:
    formatted.append(tuple(re.split(r"\s", s)))
如果您正在寻找单班轮,这是完全可能的:

x = [tuple(re.split(r"\s", s.strip())) for s in re.split(r"\n(?=\w)", text)]
正则表达式解释 第一个很简单:
r“\s”
只是在每个空格上拆分。这相当于
str.split(“”)


第二个表达式,
r“\n(?=\w)”
使用正向前瞻来匹配
\n
,在
a-zA-Z0-9
集合中只后跟一个字符。

请记住,除非这只是为了练习,否则此处不需要使用
regex
<在这种情况下,code>str.split将更简单。如果这只是为了练习
regex
,那么这将对您有用:

splt = [s.strip() for s in re.split(r"\n(?=\w)", text)] # your "first form"
formatted = [] # your "second form"
for s in splt:
    formatted.append(tuple(re.split(r"\s", s)))
如果您正在寻找单班轮,这是完全可能的:

x = [tuple(re.split(r"\s", s.strip())) for s in re.split(r"\n(?=\w)", text)]
正则表达式解释 第一个很简单:
r“\s”
只是在每个空格上拆分。这相当于
str.split(“”)


第二个表达式,
r“\n(?=\w)”
使用正向前瞻来匹配
\n
,该表达式后面只有
a-zA-Z0-9
集合中的一个字符。

第一种形式的纯正则表达式:

re.findall(r“[A-Za-z]+\s(?[0-9]{4}-[0-9]{2}-[0-9]{2}\s){2}\w++\w++.[A-z]+”,文本)
结果:

['Dave 2008-09-20 2020-05-31dave@google.com',
史蒂夫2009-01-23 2020-04-30steve@gmail.com',
“Rob 2007-02-14 2020-04-30rob@gmail.com',
“Ryan 2010-02-11 2020-03-10ryan@yahoo.com']
说明

  • [A-Za-z]+
    :匹配名称,例如“Dave”
  • \s
    :匹配名称和第一个日期之间的空格
  • (?:[0-9]{4}-[0-9]{2}-[0-9]{2}\s){2}
    :以YYYY-MM-DD的形式与两个日期(
    {2}
    )完全匹配的非捕获组,后跟空格
  • \w++\w+.[a-z]+
    :与电子邮件匹配

对于第二种形式,您可以执行以下操作:

regex=r“[A-Za-z]+\s(?[0-9]{4}-[0-9]{2}-[0-9]{2}\s){2}\w++\w++.[A-z]+”
[用于re.findall(regex,text)中的行的元组(re.split(r“\s”,row))]
但是使用函数str.split肯定会更简单:

[用于re.findall(regex,text)中的行的元组(row.split('')]
在这两种情况下,结果都是:

[('Dave','2008-09-20','2020-05-31','dave@google.com'),
('Steve'、'2009-01-23'、'2020-04-30'、'steve@gmail.com'),
('Rob','2007-02-14','2020-04-30','rob@gmail.com'),
('Ryan','2010-02-11','2020-03-10','ryan@yahoo.com')]

第一种形式的纯正则表达式:

re.findall(r“[A-Za-z]+\s(?[0-9]{4}-[0-9]{2}-[0-9]{2}\s){2}\w++\w++.[A-z]+”,文本)
结果:

['Dave 2008-09-20 2020-05-31dave@google.com',
史蒂夫2009-01-23 2020-04-30steve@gmail.com',
“Rob 2007-02-14 2020-04-30rob@gmail.com',
“Ryan 2010-02-11 2020-03-10ryan@yahoo.com']
说明

  • [A-Za-z]+
    :匹配名称,例如“Dave”
  • \s
    :匹配名称和第一个日期之间的空格
  • (?:[0-9]{4}-[0-9]{2}-[0-9]{2}\s){2}
    :以YYYY-MM-DD的形式与两个日期(
    {2}
    )完全匹配的非捕获组,后跟空格
  • \w++\w+.[a-z]+
    :与电子邮件匹配

对于第二种形式,您可以执行以下操作:

regex=r“[A-Za-z]+\s(?[0-9]{4}-[0-9]{2}-[0-9]{2}\s){2}\w++\w++.[A-z]+”
[用于re.findall(regex,text)中的行的元组(re.split(r“\s”,row))]
但是使用函数str.split肯定会更简单:

[用于re.findall(regex,text)中的行的元组(row.split('')]
在这两种情况下,结果都是:

[('Dave','2008-09-20','2020-05-31','dave@google.com'),
('Steve'、'2009-01-23'、'2020-04-30'、'steve@gmail.com'),
('Rob','2007-02-14','2020-04-30','rob@gmail.com'),
('Ryan','2010-02-11','2020-03-10','ryan@yahoo.com')]

实际上,这只是一个练习。。Idk如果我的讲师想要一行,或者实际上有一个表达式可以满足所有标准。。目前,我不会接受这个答案。。但是只要投票就好了。听起来不错,如果你有任何问题,请告诉我!是 啊现在什么都没有。。但我学到了积极的前瞻比赛。。这很好实际上这只是一个练习。。Idk如果我的讲师想要一行,或者实际上有一个表达式可以满足所有标准。。目前,我不会接受这个答案。。但是只要投票就好了。听起来不错,如果你有任何问题,请告诉我!是 啊现在什么都没有。。但我学到了积极的前瞻比赛。。这很好。你有什么特别的理由想使用正则表达式吗?当涉及到案件覆盖范围时,它们可能会被证明是相当混乱的,除非写得非常谨慎。你有什么特别的原因想使用正则表达式吗?当涉及到案件覆盖范围时,它们可能会被证明是相当混乱的,除非以最谨慎的方式书写。