添加到regexp后格式函数被截断

问题描述 投票:0回答:1

问题

我正在使用硒工具,因此我需要等待页面上的最新日期和时间更新。由于我只需要验证我的元素是否包含今天的缩写月份和日期(格式为“ 10月16日”),因此我添加了一个自定义EC来允许正则表达式搜索页面文本。我正在搜索的示例如下:

  • 例如1:星期二10月15日13:39:33 CDT 2019
  • 例如2:CDT 2019年10月16日星期三11:27:48

页面最初包含旧日期。触发了一个js函数来更新该日期,我需要等待该日期才能继续。

问题是,当使用.format()并将其添加到我的正则表达式中时,我的代码似乎截断了格式化的日期。

  1. date.today()返回预期的'2019-10-16'

  2. today.strftime('%b %d')返回预期的'Oct 16'

  3. "^(.*?(\b{}\b)[^$]*)$".format(day)返回'^(.*?Oct 1)[^$]*)$'

这是出乎意料的,我不确定为什么会发生这种情况。我正在将VS Code与蟒蛇3.6的Anaconda安装一起使用。

故障排除

我确实确认我的正则表达式可以使用https://www.regextester.com/98103我只是插入了正则表达式,包括日期的手动格式,还包括了网页中的示例文本。这并不排除存在此问题,因为我的理解是正则表达式不是通用的。

我尝试使用基本代码删除变量和格式:date_regex = "^(.*?(\b{}\b)[^$]*)$".format(date.today().strftime('%b %d'))

[尝试使用.strftime('%a')仅搜索“星期三”的日期似乎也被截断为'^(.*?We)[^$]*)$'(这并不理想,因为我可能已经有一个星期或更长时间了,无法等待)。

from datetime import date
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

# custom expected condition
class wait_for_text_to_match(object):
    def __init__(self, locator, regexp):
        self.locator = locator
        self.regexp = regexp

    def __call__(self, driver):
        element_text = EC._find_element(driver, self.locator).text
        return re.search(self.regexp, element_text)

# Code snip
                    today = date.today()
                    print(today) # Output: 2019-10-16
                    day = today.strftime('%b %d') # Ex: Oct 14
                    print(day) # output: Oct 16
                    date_regex = "^(.*?(\b{}\b)[^$]*)$".format(day)
                    date_regex
                    print(date_regex) # Output: ^(.*?Oct 1)[^$]*)$

                    wait.until(wait_for_text_to_match(
                        (By.XPATH, 
                        '//*[@id="syncInfo"]/div/table/tbody/tr[7]/td[2]'), 
                        date_regex))

需要的结果

我的期望是正则表达式将被格式化为包括我构建的整个一天。

  • 当前:^(.*?Oct 1)[^$]*)$
  • 预期:^(.*?Oct 16)[^$]*)$

如果操作正确,则将其插入我的自定义EC中,如果找到,则使我的代码等待定义的超时。

python
1个回答
0
投票

您需要为正则表达式使用原始字符串,或转义反斜杠。常规字符串文字中的\b是退格键,因此当您在终端上打印正则表达式时,它将备份并在日期的最后一位上打印下一个字符。而且正则表达式不匹配,因为网页中没有退格键。

date_regex = r"^(.*?(\b{}\b)[^$]*)$".format(day)
© www.soinside.com 2019 - 2024. All rights reserved.