【问题标题】:Grabbing text between either double/single quote in Python regex在 Python 正则表达式中抓取双引号/单引号之间的文本
【发布时间】:2018-03-18 13:31:51
【问题描述】:

我有一堆(数千个)用 JavaScript 中的 Selenium RC 接口编写的旧单元测试脚本。由于我们正在升级到 Selenium 3,我想尝试使用 Python 脚本以自动化方式摆脱一些 RC 方法。我逐行遍历这些脚本,选择 Selenese 方法,解构它们,然后尝试使用 WebDriver 接口进行重建。例如:

selenium.type("xpath=//*[text()='test, xpath']", "test, text");

将输出为...

driver.findElement(By.xpath("//*[text()='test, xpath']")).sendKeys("test, text");

我有一个自动识别 Selenese 方法、存储空格并将方法与参数分开的系统,所以我剩下的是以下字符串:

("xpath=//*[text()='test, xpath']", "test, text")

我遇到的一个问题是,这些并不总是一致的。有时双引号嵌套在单引号中,反之亦然,或者转义的双引号嵌套在双引号中等。例如:

("xpath=//*[text()=\"test, xpath\"]", "test, text")
('xpath=//*[text()=\'test, xpath\']', 'test, text')
('xpath=//*[text()="test, xpath"]', 'test, text')

这些都是有效的。我希望能够始终匹配传递给方法的参数,无论是使用双引号还是单引号,加上忽略与打开字符串和转义引号相反的嵌套引号,然后将它们作为列表返回。

['xpath=//*[text()="test, xpath"]', 'test, text']

...等等。我尝试使用以下表达式来使用 re.findall。

([\"'])(?:(?=(\\?))\2.)*?\1

我得到的是这个。

>>> print arguments
[('"', ''), ('"', '')]

我有什么遗漏吗?

【问题讨论】:

  • 匹配所有单/双引号字符串:'(([^'\\]*(\\.)?)*)'|"(([^"\\]*(\\.)?)*)"

标签: python selenium webdriver


【解决方案1】:

我不会使用lookbehind 或lookahead 让它变得如此复杂。相反,我会构建一个特定于案例的正则表达式。在你的情况下,你有类似下面的东西

("param1", "param2")

('param1', 'param2')

在这些参数中,您可能有额外的转义引号或单引号或其他。但如果看一件事,使用", "', ' 拆分它,这些确切的模式很少会出现在param1 和param2 中

所以最简单的非正则表达式解决方案是根据", "', ' 进行拆分。但是接下来可能会有多余的空格或者没有空格,所以我们使用一个模式

^\(\s*["']\s*(?<first_param>.*?)("\s*,\s*"|'\s*,\s*')(?<second_param>.*?)\s*["']\s*\)$

\(\s*["']\s* 匹配第一个括号和任何起始引号

(?&lt;first_param&gt;.*?)匹配第一个参数

("\s*,\s*"|'\s*,\s*') 匹配我们的拆分命令模式

(?&lt;second_param&gt;.*?) 匹配第二个参数

\s*["']\s*\)$ 匹配结尾。

这并不完美,但适用于您 95% 以上的情况

您可以在下面的链接中查看正则表达式小提琴

https://regex101.com/r/z9PytD/1/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    相关资源
    最近更新 更多