【问题标题】:Regex With Lookahead For Fixed Length String正则表达式与固定长度字符串的前瞻
【发布时间】:2020-12-06 16:18:26
【问题描述】:
strings = [
    r"C:\Photos\Selfies\1|",
    r"C:\HDPhotos\Landscapes\2|",
    r"C:\Filters\Pics\12345678|",
    r"C:\Filters\Pics2\00000000|",
    r"C:\Filters\Pics2\00000000|XAV7"
    ]
    
for string in strings:
    matchptrn = re.match(r"(?P<file_path>.*)(?!\d{8})", string)
    if matchptrn:
        print("FILE PATH = "+matchptrn.group('file_path'))

我正试图让这个正则表达式以我想的方式工作。大多数网站上的 Look Aheads 示例似乎是非常基本的字符串匹配,即不匹配 'bar',如果它前面有一个 'foo' 作为否定查找的示例。

我的目标是仅当字符串 NOT 在管道符号 | 之前在其中包含 8 个字符长度的数字并匹配任何内容时,才在组 file_path 中捕获实际文件路径在另一组中的管道符号之后(我没有在这里实现)。

所以在上面的例子中它应该只匹配前两个字符串

C:\Photos\Selfies\1
C:\HDPhotos\Landscapes\2

如果是最后一个字符串

C:\Filters\Pics2\00000000|XAV7

我想匹配 &lt;file_path&gt; 中的 C:\Filters\Pics2\00000000 并匹配另一个名为 .
的组中的 XAV7 (如果我能在负面展望方面得到一些帮助,我可以自己解决这个问题)

目前 匹配所有内容,这是有道理的,因为它是非贪婪的 (.*) 我希望它仅在管道符号之前的字符串的最后一部分不是 8 长度字符时捕获。

下面粘贴的代码片段的输出

FILE PATH = C:\Photos\Selfies\1|
FILE PATH = C:\HDPhotos\Landscapes\2|
FILE PATH = C:\Filters\Pics\12345678|
FILE PATH = C:\Filters\Pics2\00000000|
FILE PATH = C:\Filters\Pics2\00000000|XAV7

\\进行此修改

matchptrn = re.match(r"(?P<file_path>.*)\\(?!\d{8})", string)
if matchptrn:
    print("FILE PATH = "+matchptrn.group('file_path'))

让事情变得更糟,因为输出是

FILE PATH = C:\Photos\Selfies
FILE PATH = C:\HDPhotos\Landscapes
FILE PATH = C:\Filters
FILE PATH = C:\Filters
FILE PATH = C:\Filters

有人也可以解释一下吗?

【问题讨论】:

  • Regex lookahead, lookbehind and atomic groups 是否给你你正在寻找的答案
  • @itprorh66 不幸的是,不,我通过了答案,但我想我不够聪明,无法找出问题所在,我已经通过反复试验测试了几种组合,但似乎都没有工作。
  • 我听说你兄弟,我不是正则表达式专家,所以帮不上忙。
  • 我想我在阅读更多内容后设法弄清楚了这一点 --> (?![\\\:\w\d]+\\\d{8}\|.* )(?P^.*) 我还在测试它,所以我可能错了。

标签: python-3.x regex regex-lookarounds


【解决方案1】:

你可以使用

^(?!.*\\\d{8}\|$)(?P<file_path>.*)\|(?P<suffix>.*)

请参阅regex demo

详情

  • ^ - 字符串的开头
  • (?!.*\\\d{8}\|$) - 如果字符串包含 \ 后跟八位数字,然后在字符串末尾 |,则匹配失败
  • (?P&lt;file_path&gt;.*) - 组“file_path”:尽可能多的除换行符以外的任何零个或多个字符
  • \| - 一个管道
  • (?P&lt;suffix&gt;.*) - 组“后缀”:字符串的其余部分,除换行符之外的任何零个或多个字符,尽可能多。

Python demo

import re
strings = [
    r"C:\Photos\Selfies\1|",
    r"C:\HDPhotos\Landscapes\2|",
    r"C:\Filters\Pics\12345678|",
    r"C:\Filters\Pics2\00000000|",
    r"C:\Filters\Pics2\00000000|XAV7"
    ]
    
for string in strings:
    matchptrn = re.match(r"(?!.*\\\d{8}\|$)(?P<file_path>.*)\|(?P<suffix>.*)", string)
    if matchptrn:
        print("FILE PATH = {}, SUFFIX = {}".format(*matchptrn.groups()))

输出:

FILE PATH = C:\Photos\Selfies\1, SUFFIX = 
FILE PATH = C:\HDPhotos\Landscapes\2, SUFFIX = 
FILE PATH = C:\Filters\Pics2\00000000, SUFFIX = XAV7

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    相关资源
    最近更新 更多