格式化原始字符串Python

格式化原始字符串Python,python,string,format,scrape,Python,String,Format,Scrape,我有一个Python中的原始字符串,它是通过imap库检索的 看起来是这样的: Season: Winter 2017-18 Activity: Basketball - Boys JV *DATE: 02/13/2018 * - ( previously 02/06/2018 ) Event type: Game Home/Host: Clear Lake Opponent: Webster City *START TIME: 6:15PM CST* - ( previously 4:30PM

我有一个Python中的原始字符串,它是通过imap库检索的

看起来是这样的:

Season: Winter 2017-18
Activity: Basketball - Boys JV
*DATE: 02/13/2018 * - ( previously 02/06/2018 )
Event type: Game
Home/Host: Clear Lake
Opponent: Webster City
*START TIME: 6:15PM CST* - ( previously 4:30PM CST )
Location: Clear Lake High School, 125 N. 20th Street, Clear Lake, IA
取消每个标签后面的数据的最佳方法是日期:例如日期:2018年2月13日*-之前的2018年2月6日将设置为与日期类似的变量,因此打印日期时,2018年2月13日*-之前的2018年2月6日将是输出

我尝试了下面的代码,但它每行打印一个字符。谢谢

for line in message:
     if "DATE:" in line:
          print line

您可以使用正则表达式和字典:

import re
s = """
Season: Winter 2017-18
Activity: Basketball - Boys JV
*DATE: 02/13/2018 * - ( previously 02/06/2018 )
Event type: Game
Home/Host: Clear Lake
Opponent: Webster City
*START TIME: 6:15PM CST* - ( previously 4:30PM CST )
Location: Clear Lake High School, 125 N. 20th Street, Clear Lake, IA
"""
final_dict = {(a[1:] if a.startswith('*') else a).strip('\r'):b.strip('\r') for a, b in filter(lambda x:len(x)> 1, [re.split('\:\s', i) for i in filter(None, s.split('\n'))])}
输出:

{'Home/Host': 'Clear Lake', 'Season': 'Winter 2017-18', 'START TIME': '6:15PM CST* - ( previously 4:30PM CST )', 'Location': 'Clear Lake High School, 125 N. 20th Street, Clear Lake, IA', 'Activity': 'Basketball - Boys JV', 'DATE': '02/13/2018 * - ( previously 02/06/2018 )', 'Event type': 'Game', 'Opponent': 'Webster City'}

您可以使用正则表达式和字典:

import re
s = """
Season: Winter 2017-18
Activity: Basketball - Boys JV
*DATE: 02/13/2018 * - ( previously 02/06/2018 )
Event type: Game
Home/Host: Clear Lake
Opponent: Webster City
*START TIME: 6:15PM CST* - ( previously 4:30PM CST )
Location: Clear Lake High School, 125 N. 20th Street, Clear Lake, IA
"""
final_dict = {(a[1:] if a.startswith('*') else a).strip('\r'):b.strip('\r') for a, b in filter(lambda x:len(x)> 1, [re.split('\:\s', i) for i in filter(None, s.split('\n'))])}
输出:

{'Home/Host': 'Clear Lake', 'Season': 'Winter 2017-18', 'START TIME': '6:15PM CST* - ( previously 4:30PM CST )', 'Location': 'Clear Lake High School, 125 N. 20th Street, Clear Lake, IA', 'Activity': 'Basketball - Boys JV', 'DATE': '02/13/2018 * - ( previously 02/06/2018 )', 'Event type': 'Game', 'Opponent': 'Webster City'}
可以使用将字符串拆分为多行。然后在这些行上迭代并使用a提取数据,例如:

import re

for line in message.splitlines():
    match = re.match(r'\*DATE: (.*)', line)
    if match:
        date = match.group(1)
        print date
可以使用将字符串拆分为多行。然后在这些行上迭代并使用a提取数据,例如:

import re

for line in message.splitlines():
    match = re.match(r'\*DATE: (.*)', line)
    if match:
        date = match.group(1)
        print date
因为消息行迭代消息中的每个项目:简单来说,消息是一个字符串,它的项目是字符,因为它迭代每个字符

拆分是解决问题的简单/简单方法,但只要您的数据不变得太复杂,就可能有效:

使用message.split\n拆分换行符上的字符串并迭代该字符串。然后,可以使用line.strip.strip*.split:,maxplit=1将键与值分开。第一个条带删除可能保留的额外空白,如潜在的空白,第二个条带删除额外的星号。maxsplit=1在第一个冒号处停止,如果数据中有冒号作为标签的一部分,则可能会出现问题

我之所以说key/value,是因为您可能并不真正需要或不想动态地将这些对分配给实际变量,并且可能只需要将其存储为dict并根据需要进行查询

output = dict()
for line in message.split("\n"): ## Split Lines
    key,value = line.strip().split(":",maxsplit=1) ## Remove extra whitespace/* and split at the first colon
    output[key] = value
编辑:我的印象是日期只是你的例子,但如果这就是你想要的,那么显然只要在key==date中添加一行,然后返回/打印/etc值。

对于消息行,它会迭代消息中的每个项目:简单地说,消息是一个字符串,它的项目是字符,因为它会迭代每个字符

拆分是解决问题的简单/简单方法,但只要您的数据不变得太复杂,就可能有效:

使用message.split\n拆分换行符上的字符串并迭代该字符串。然后,可以使用line.strip.strip*.split:,maxplit=1将键与值分开。第一个条带删除可能保留的额外空白,如潜在的空白,第二个条带删除额外的星号。maxsplit=1在第一个冒号处停止,如果数据中有冒号作为标签的一部分,则可能会出现问题

我之所以说key/value,是因为您可能并不真正需要或不想动态地将这些对分配给实际变量,并且可能只需要将其存储为dict并根据需要进行查询

output = dict()
for line in message.split("\n"): ## Split Lines
    key,value = line.strip().split(":",maxsplit=1) ## Remove extra whitespace/* and split at the first colon
    output[key] = value

编辑:我的印象是date只是你的例子,但是如果这就是你想要的,那么很明显只要添加一行if key==date并返回/打印/etc值即可。

如果你的数据在一个名为datafile.txt的文件中,你可以尝试以下方法:

with open('datafile.txt', 'r') as f:
    for line in f:
         if line.startswith("*DATE:"):
            print(line)

如果数据位于名为datafile.txt的文件中,则可以尝试以下操作:

with open('datafile.txt', 'r') as f:
    for line in f:
         if line.startswith("*DATE:"):
            print(line)

这种解决方案是有效的,我相信这是相当好的:

lines = message.split("\n") # Split your message into "lines"
sections = [line.split(": ") for line in lines] # Split lines by the "colon space"
message_dict = {section[0].lstrip(' '): section[1] for section in sections} # Dictionary comprehension to put your keys and values into a dict struct. Also removes leading whitespace from your keys.

这种解决方案是有效的,我相信这是相当好的:

lines = message.split("\n") # Split your message into "lines"
sections = [line.split(": ") for line in lines] # Split lines by the "colon space"
message_dict = {section[0].lstrip(' '): section[1] for section in sections} # Dictionary comprehension to put your keys and values into a dict struct. Also removes leading whitespace from your keys.

这只是一个例子,但如果我至少能做到这一点,我相信我可以从那里开始。谢谢我才意识到我犯了一个愚蠢的错误;;在第三行,这应该只是一个赋值,但出于某种原因,我重复了它。答案已更新。我运行了你的,但我得到了以下错误:TypeError:split不接受关键字参数像Python2中那样接受关键字参数:只提供参数作为位置参数。i、 e.-split:,1I执行了此操作并得到了此错误:ValueError:需要超过1个值才能解包代码看起来是这样的:utput=dict用于消息中的行。split\n:split Lines key,value=line.strip.split:,1删除额外的空格/*并在第一个冒号输出处拆分[key]=value printoutput@Reid Ballard这只是一个例子,但如果我至少能得到它,我相信我可以从那里开始。谢谢我才意识到我犯了一个愚蠢的错误;;在第三行,这应该只是一个赋值,但出于某种原因,我重复了它。答案已更新。我运行了你的,但我得到了以下错误:TypeError:split不接受关键字参数像Python2中那样接受关键字参数:只提供参数作为位置参数。i、 e.-split:,1I执行了此操作并得到了此错误:ValueError:需要超过1个值才能解包代码看起来是这样的:utput=dict用于消息中的行。split\n:split Lines key,value=line.strip.split:,1删除额外的空格/*并在第一个冒号输出处拆分[key]=value printoutput@Reid BallardIt看起来您的解决方案可以工作,但我需要帮助使其运行。我得到了以下错误:“文件C:/Users/Lewis/PycharmProjects/alertsMessager/main.py,第47行,进程中邮箱final\u d”
ict={a[1:]如果a.startswith else a:b代表a,b在[re.split'\:\s],i在filterNone,s.split'\n']}文件C:/Users/Lewis/PycharmProjects/alertsMessager/main.py,第47行,在定语中={a[1:]如果a.startswith else a:b代表a,b在[re.split'\:\s',i在filterNone,s.split'\n'}ValueError:需要超过1个值才能解包“@user284344您正在从.txt文件读取游戏日志吗?如果是这样,那么这可能是错误的原因。如果只运行[re.split'\:\s',i for i in filterNone,s.split'\n'],你能发布你得到的输出吗?@Ajax1234看起来是从一封电子邮件中提取的,因为他声称是从IMAP库中获得的,所以我猜是字符串。据我所知,虽然regex中的冒号不需要escaped@Ajax1234当我运行[re.split'\:\s',我在FilterOne中为我,s.split'\n'[[['赛季','2017-18年冬季'],['活动','篮球男孩合资'],['日期','02/13/2018*-之前的02/06/2018'],['事件类型','Game'],[‘主办方/主持人’、‘Clear Lake’、[‘对手’、‘Webster City’、[‘开始时间’、[‘下午6:15中央标准时间-之前的中央标准时间下午4:30’]、[‘地点’、‘Clear Lake高中,地址:伊利诺伊州Clear Lake第20街125号,['']]我在你的代码中看不到这一行,除非我找错地方了?@ajax1234看起来你的解决方案会起作用,但我需要帮助才能运行它。我得到以下错误:“文件C:/Users/Lewis/PycharmProjects/alertsMessager/main.py,第47行,进程中_邮箱final_dict={a[1:]如果a.startswith else a:b代表a,b在[re.split'\:\s',i代表filterNone中的i,s.split'\n']}文件C:/Users/Lewis/PycharmProjects/alertsMessager/main.py,第47行,在定语中={a[1:]如果a.startswith else a:b代表a,b代表[re.split'\:\s',i代表filterNone中的i,s.splitValueError:解包“@user284344是否从.txt文件读取游戏日志?如果是,则这可能是错误的原因。如果只运行[re.split'\:\s',i for i in filterOne,s.split'\n',是否可以发布您得到的输出?@Ajax1234似乎是从一封电子邮件中提取出来的,因为他声称自己是从IMAP库中获得的,所以我猜这是一个字符串。据我所知,尽管regex中的冒号不需要是escaped@Ajax1234当我运行[re.split'\:\s',我在FilterOne,s.split'\n'][[[“季节”,“2017-18年冬季]]时,我得到了这个,[“活动”、“篮球-男孩合资企业”]、[“日期”、“2018年2月13日*-之前为2018年6月2日”]、[“事件类型”、“比赛”]、[“主场/主办方”、“清湖”]、[“对手”、“韦伯斯特城”]、[“*开始时间”、“中央标准时间下午6:15-之前为中央标准时间下午4:30”],['Location','Clear Lake高中,伊利诺伊州Clear Lake第20街125号',['''']我在你的代码中看不到这一行,除非我找错地方了?@Ajax1234