当前位置: 首页 > 面试题库 >

否定超前断言在python中不起作用

赵光赫
2023-03-14
问题内容

任务:
-给定:图像文件名列表
-待办事项:使用不包含单词“ thumb”的文件名创建一个新列表-即仅定位非缩略图图像(使用PIL-Python Imaging Library)。

我已经尝试过,r".*(?!thumb).*"但是失败了。

我找到了一种解决方案(在stackoverflow上),将a^放在正则表达式前面,并将其.*放入否定的lookahead中:r"^(?!.*thumb).*"现在可以使用。

问题是,我想了解为什么我的第一个解决方案不起作用但我却不起作用。由于正则表达式非常复杂,因此我非常想了解它们。

我的理解是,^告诉解析器以下条件要在字符串的开头匹配。但是.*(不起作用的)第一个示例中的还是不是从字符串的开头开始?我以为它将从字符串的开头开始,并在到达“拇指”之前搜索尽可能多的字符。如果是这样,它将返回不匹配项。

可以请人解释为什么r".*(?!thumb).*"不起作用但是起作用r"^(?!.*thumb).*"吗?

谢谢!


问题答案:

(该死,乔恩击败了我。哦,好了,你还是可以看一下例子)

就像其他人所说的那样,正则表达式并不是这项工作的最佳工具。如果使用文件路径,请查看os.path。

至于不想要的文件过滤,if 'thumb' not in filename: ...请在解剖路径后执行操作(其中filenamestr)。

为了后代,这是我对那些正则表达式的想法。r".*(?!thumb).*"之所以无法工作,是因为.*贪婪,并且对前瞻的优先级非常低。看看这个:

>>> re.search('(.*)((?!thumb))(.*)', '/tmp/somewhere/thumb').groups()
('/tmp/somewhere/thumb', '', '')
>>> re.search('(.*?)((?!thumb))(.*)', '/tmp/somewhere/thumb').groups()
('', '', '/tmp/somewhere/thumb')
>>> re.search('(.*?)((?!thumb))(.*?)', '/tmp/somewhere/thumb').groups()
('', '', '')

最后一个很奇怪…

另一个正则表达式(r"^(?!.*thumb).*")之所以起作用,.*是因为它位于前行中,因此您不会遇到字符被盗的任何问题。您实际上甚至不需要^,具体取决于您使用的是re.match还是re.search

>>> re.search('((?!.*thumb))(.*)', '/tmp/somewhere/thumb').groups()
('', 'humb')
>>> re.search('^((?!.*thumb))(.*)', '/tmp/somewhere/thumb').groups()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'
>>> re.match('((?!.*thumb))(.*)', '/tmp/somewhere/thumb').groups()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'


 类似资料:
  • 问题内容: 我正在尝试编写一个断言,以检查用户提供的大小是否为正值,如果不是,则使其为正,此语句位于类构造函数内部,该类构造函数采用大小值,然后生成array [size]。我写了下面的代码,我认为是正确的。 尽管我似乎从未评估过我的断言并继续执行程序,但会导致NegativeArraySize错误(我正在尝试避免) 我也尝试过 并且程序无法停止为负值。 我最近在Mac上运行Java时遇到了一些问

  • 使用Hamcrest可以很容易地否定匹配器。例如。您可以这样编写断言:

  • 否定断言函数。 接受一个断言函数,并用它的参数应用逻辑非运算符 (!) 。 const negate = func => (...args) => !func(...args); [1, 2, 3, 4, 5, 6].filter(negate(n => n % 2 == 0)); // [ 1, 3, 5 ]

  • 问题内容: 从Selenium到WebDriver及其各自文档的更改可能会让我感到困惑。在文档中有关测试设计的部分中,讨论了使用Assert vs Verify( 例如AssertElementPresent)。但是,在阅读WebDriver教程并开始设置测试时,Python似乎没有提供此功能。我是否忽略了文档中的内容,这是否不适用于WebDriver,不适用于使用python,我应该使用pyth

  • 我的自定义方言与处理器不解析任何值,我不知道为什么。在生成的视图中,${Content}应该在的地方没有任何东西,在将标签更改为th: text后,它会出现。我使用Spring Boot v1.5.9。发布,Springv4.3.13。发布 pom.xml依赖(它的子模块) LineSeparator处理器。JAVA 我的方言。JAVA 胸腺onfiguration.java 看法html

  • 问题内容: 在调试pycharm中的代码时,按Ctrl + C时,我的python try / except循环似乎不会触发键盘中断。我的代码如下所示: 编辑: 我的精简代码工作似乎出现了一些问题,并且没有产生相同的错误。完整的代码可以在这里查看。我还重新整理了代码(上面的代码),并产生了相同的错误。 问题答案: 从屏幕截图中可以看出,您正在IDE中运行此代码。关于IDE的问题是,它们与正常运行并

  • 问题内容: 我正在Windows Vista上工作,但是我正在从DOS命令运行python。我有这个简单的python程序。(实际上是一个名为test.py的py文件) 当我从Dos命令执行“ python test.py”时,它不起作用。例如,如果执行前的提示“ Dos命令”是这样的: 执行后,必须是这样的: 帮助Plz。 问题答案: 首先,您通常不想使用-而是看一下子流程模块。但是,那并不能解

  • < code>onIncomingCall()是来自第三方库< code>pjsip中的类的重写方法。当使用SIP进行传入呼叫时,调用此方法。不知何故,这个方法使得只有当呼叫应答代码在同一个方法中或者在同一个方法中被调用时,呼叫才有可能被应答。但是我希望当用户按下按钮时,电话被接听。我已经创建了一个回调函数,并让用户在呼叫到来时按下按钮,但是如果在< code>onIncomingCall()方法