在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']
说明:
:匹配名称,例如“Dave”[A-Za-z]+
:匹配名称和第一个日期之间的空格\s
:以YYYY-MM-DD的形式与两个日期((?:[0-9]{4}-[0-9]{2}-[0-9]{2}\s){2}
)完全匹配的非捕获组,后跟空格{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如果我的讲师想要一行,或者实际上有一个表达式可以满足所有标准。。目前,我不会接受这个答案。。但是只要投票就好了。听起来不错,如果你有任何问题,请告诉我!是 啊现在什么都没有。。但我学到了积极的前瞻比赛。。这很好。你有什么特别的理由想使用正则表达式吗?当涉及到案件覆盖范围时,它们可能会被证明是相当混乱的,除非写得非常谨慎。你有什么特别的原因想使用正则表达式吗?当涉及到案件覆盖范围时,它们可能会被证明是相当混乱的,除非以最谨慎的方式书写。