3

有什么方法可以完全反向匹配我使用的正则表达式。

(?!...)仅适用于简单模式。我的意思是我有一个正则表达式来匹配多种格式,但我想替换字符串中的所有内容,除了我的多种格式。

比如说:我写了一个复杂的 RegEx 模式来查找星期几、几小时、几个月、几年。而不是找到这些匹配项并使用这些模式拆分我的字符串并加入所有匹配项;如果有逆匹配,我可以单发替换它。

如何使用正则表达式“反向匹配”中给出的解决方案?不是支持一切。

例子

hr = """
Monday: 11:30am - 9:30pm Tuesday: 11:30am - 9:30pm
Wednesday: 11:30am - 10:00pm Thursday: 11:30am - 10:00pm 
Friday: 11:30am - 10:30pm Saturday: 11:00am - 10:30pm
(brunch served until 3pm) Sunday: 10:30am - 9:30pm (brunch served until 3pm)
Happy Hour and Special Appetizer menu starting at $3 in the bar. Hours from 4 - 7pm Daily.
$4 BURGER special available on Monday. Wednesday: 1/2 off all bottled wines (4-close)"""


import re

newStr = []
dayPattern = """
   (?:mon|tue|wed|thu|fri|sat|sun|thurs)(?:day)?(?:[.:])*
   \s*
   (?:\d{1,2}(?:[:]\d{1,2})?)\s*(?:[ap][.]?m.?) # Start hour
   \s*[-|to]+\s*
  (?:\d{1,2}(?:[:]\d{1,2})?)\s*(?:[ap][.]?m.?) # Close   hour
 """

newStr.extend(\
    re.findall(re.compile(dayPattern, re.VERBOSE|re.IGNORECASE), hr))

print " ".join(newStr)

输出

Monday: 11:30am - 9:30pm  Thursday: 11:30am - 10:00pm  Friday: 11:30am - 10:30pm  Sunday: 10:30am - 9:30pm

但我在这里失踪了"Monday: 11:30am - 9:30pm Tuesday: 11:30am - 9:30pm Wednesday: 11:30am - 10:00pm Thursday: 11:30am - 10:00pm Friday: 11:30am - 10:30pm"

我也可以修改我的正则表达式以包含此模式

但不是这样做,有没有办法可以删除除周一/周二/....和周一/周二/周三...和上午 11:00/下午 12 点之外的任何单词...

即,我想要的是这个输出: Monday: 11:30am - 9:30pm Tuesday: 11:30am - 9:30pm Wednesday: 11:30am - 10:00pm Thursday: 11:30am - 10:00pm Friday: 11:30am - 10:30pm Saturday: 11:00am - 10:30pm Sunday: 10:30am - 9:30pm

4

1 回答 1

0

我不明白你做反向正则表达式的意图。findall()似乎是一种选择时间的自然方式,如下所示:

' '.join(re.findall(r'\w{3,6}day:\s*\d{1,2}:\d{1,2}[ap]m\s*-\s*\d{1,2}:\d{1,2}[ap]m', hr))

它产生:

'Monday: 11:30am - 9:30pm Tuesday: 11:30am - 9:30pm Wednesday: 11:30am - 10:00pm Thursday: 11:30am - 10:00pm Friday: 11:30am - 10:30pm Saturday: 11:00am - 10:30pm Sunday: 10:30am - 9:30pm'
于 2013-09-13T13:59:48.967 回答