【问题标题】:Slice when character appears字符出现时切片
【发布时间】:2018-07-26 14:57:37
【问题描述】:

我有这个字符串:

Sun 10:00am - 10:00pm<br>Mon 10:00am - 10:00pm<br>Tue 10:00am - 10:00pm<br>Wed 10:00am - 10:00pm<br>Thu 10:00am - 10:00pm<br>Fri 10:00am - 10:00pm<br>Sat 10:00am - 10:00pm

我只想提取出现的前 2 个小时(即上午 10:00 和晚上 10:00)

我正在尝试切片和拆分,但没有成功。

【问题讨论】:

  • 我添加了正则表达式,因为这些问题几乎总能用它解决。基本上我们不会寻找模式并找到所有匹配项并取前 2 个。
  • 您可以发布您尝试使用的代码吗?

标签: python regex split slice


【解决方案1】:

正则表达式:

(?<=\s)\d{2}:\d{2}[ap]m

将获得所有 HH:MM 匹配项,您需要使用例如获得前两个匹配项使用re.findall时列出切片[:2]

没有正则表达式:

&lt;br&gt;标签上分割,然后再用空格,得到第二个和最后一个元素:

str_.split('<br>')[0].split()
[out[1], out[-1]]

示例:

In [56]: str_ = 'Sun 10:00am - 10:00pm<br>Mon 10:00am - 10:00pm<br>Tue 10:00am - 10:00pm<br>Wed 10:00am - 10:00pm<br>Thu 10:00am - 10:00pm<br>Fri 10:00am - 10:00pm<br>Sat 10:00am - 10:00pm'

In [57]: re.findall(r'(?<=\s)\d{2}:\d{2}[ap]m', str_)[:2]
Out[57]: ['10:00am', '10:00pm']

In [58]: out = str_.split('<br>')[0].split()

In [59]: [out[1], out[-1]]
Out[59]: ['10:00am', '10:00pm']

【讨论】:

  • 为什么不只是findall('\d{2}:\d{2}[a|p]m',text)
  • @danihp 是的,我也想过这个
  • @danihp 因为事先严格匹配一个空格,这里不确定是否需要,OP可以确认。请注意,在您的 [a|p] 中,| 是在 [] 中的字面意思。
  • @AntonvBR 见上文:)
【解决方案2】:

我认为这个正则表达式会做:

import re

s= 'Sun 10:00am - 10:00pm<br>Mon 10:00am - 10:00pm<br>Tue 10:00am - 10:00pm<br>Wed 10:00am - 10:00pm<br>Thu 10:00am - 10:00pm<br>Fri 10:00am - 10:00pm<br>Sat 10:00am - 10:00pm'

pattern = r'\d{2}:\d{2}[AaPp][Mm]'

timestamps = re.findall(pattern, s)[:2]

print(timestamps)

【讨论】:

  • 这是错误的。 | 内的 [] 按字面意思处理。使用 1) [ap]m 或 2) (a|p)m
  • @heemayl 啊谢谢。在这方面我还是很新手。
  • 不确定您的意思。一个例子?
  • 就像第 2 点所说的那样:(a|p)m。请注意 []() 运算符。
  • () 的等价物是:(A|a|P|p)(M|m)。您还可以查看 re.IGNORECASE 以了解不区分大小写的情况。
【解决方案3】:

不需要正则表达式:

s = "Sun 10:00am - 10:00pm<br>Mon 10:00am - 10:00pm<br>Tue 10:00am - 10:00pm<br>Wed 10:00am - 10:00pm<br>Thu 10:00am - 10:00pm<br>Fri 10:00am - 10:00pm<br>Sat 10:00am - 10:00pm"


spl = s.split("<br>")   # split at <br> into the days
d={} # empty dict
for s in spl:  # for each day
    d.setdefault(s.split(" ")[0],[]).extend([x for x in s.split(" ") 
                                             if x!= '-'][1:])
print(d)

输出:

 {'Wed': ['10:00am', '10:00pm'], 
  'Sun': ['10:00am', '10:00pm'], 
  'Fri': ['10:00am', '10:00pm'], 
  'Tue': ['10:00am', '10:00pm'], 
  'Mon': ['10:00am', '10:00pm'], 
  'Thu': ['10:00am', '10:00pm'], 
  'Sat': ['10:00am', '10:00pm']}

它将您的数据分成几天(&lt;br&gt;)并将每一天分成工作日(作为关键)和两个时间到一个列表中,省略我们已经作为 dict 和 @987654324 关键的日期@那是在时代之间。

您可以通过tueTime = d['Tue'] 获得周二的时间列表,并且可以通过[0] or [1] 或通过分解open,close = tueTime 访问它。


如果您只需要第一个,请使用:spl = s.split("&lt;br&gt;")[0] - dict 是无序的,您不会知道哪个是数据字符串中的第一个。

【讨论】:

  • 确实不需要正则表达式,但是从字符串中提取文本确实不需要不使用正则表达式。它很容易理解和适应新情况。
猜你喜欢
  • 2020-11-27
  • 2011-07-26
  • 2018-10-18
  • 2019-03-11
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
相关资源
最近更新 更多