Python和和或

时间:2018-04-12 14:57:49

标签: regex python-3.x

我需要一个代码来评估几个规则以突出显示某些文本,而我在尝试理解OR和AND如何工作时遇到了问题。

规则:

if not text.endswith((".", "!", "?", "//", ":"))
if not bool(re.search('[0-5][0-9]:[0-5][0-9]', text)
if not text[0].isupper()
if not text[0] == "["
if not any(i in text[0] for i in ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]))

这是我目前的代码:

elif (not text.endswith((".", "!", "?", "//", ":"))
    and not bool(re.search('[0-5][0-9]:[0-5][0-9]', text))
    or not text[0].isupper()
    or not text[0] == "["
    or not any(i in text[0] for i in ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"])):
    # highlight text

第一个问题显然是我没有得到何时使用OR以及何时使用AND(尽管检查文档)。

作为奖金问题:关于我的正则表达规则。它不应该突出显示文本,如果它只是“33:44”,但它应该如果一行说“我们今天44:44”没有最后一个点。我不知道该怎么做。

另外,如果代码可以简化,我会很感激。

1 个答案:

答案 0 :(得分:0)

我不确定我是否正确理解了您的问题。但是如果你

  • 希望仅匹配字符串开头的大写字母
  • 可以有[0-5] [0-9]:[0-5] [0-9]格式的数字
  • 字符串不应以给定的任何字符结尾

如果是这种情况,您可以尝试使用简单的正则表达式

import re
re.search(r"""(^[A-Z] #starting letter to be a upper case alphabet
      .*? #anything in between
      [0-5][0-9]:[0-5][0-9] #digits of the given format
      .*? # anything again
      [^.!?//:]$ # none of these characters at the end
     )""", text, re.X)

您可以根据自己的要求修改模式。