具有固定长度字符串前瞻性的正则表达式
Regex With Lookahead For Fixed Length String
strings = [
r"C:\Photos\Selfies|",
r"C:\HDPhotos\Landscapes|",
r"C:\Filters\Pics345678|",
r"C:\Filters\Pics2[=10=]000000|",
r"C:\Filters\Pics2[=10=]000000|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' 作为一个负面的例子。
我的目标是在 file_path
组中捕获实际文件路径,前提是字符串 NOT 在管道之前有一个 8 个字符长度的数字symbol |
并匹配另一组中管道符号之后的任何内容(我在这里没有实现)。
所以在上面的例子中它应该只匹配前两个字符串
C:\Photos\Selfies
C:\HDPhotos\Landscapes
如果是最后一个字符串
C:\Filters\Pics2[=12=]000000|XAV7
我想在 <file_path>
中匹配 C:\Filters\Pics2[=18=]000000
并在另一个名为 .
的组中匹配 XAV7
(如果我在负面展望方面得到一些帮助,我可以自己解决这个问题)
当前 匹配所有内容,这是有道理的,因为它是非贪婪的 (.*)
我希望它仅在管道符号之前的字符串的最后一部分不是 8 长度字符时才捕获。
下面粘贴的代码片段输出
FILE PATH = C:\Photos\Selfies|
FILE PATH = C:\HDPhotos\Landscapes|
FILE PATH = C:\Filters\Pics345678|
FILE PATH = C:\Filters\Pics2[=13=]000000|
FILE PATH = C:\Filters\Pics2[=13=]000000|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
有人也可以解释一下吗?
您可以使用
^(?!.*\\d{8}\|$)(?P<file_path>.*)\|(?P<suffix>.*)
参见regex demo。
详情
^
- 字符串的开头
(?!.*\\d{8}\|$)
- 如果字符串包含 \
后跟八位数字,然后在字符串 末尾包含 |
,则匹配失败
(?P<file_path>.*)
- 组“file_path”:除换行字符外的任何零个或多个字符尽可能多
\|
- 一根烟斗
(?P<suffix>.*)
- “后缀”组:字符串的其余部分,除换行字符外的任何零个或多个字符,尽可能多。
import re
strings = [
r"C:\Photos\Selfies|",
r"C:\HDPhotos\Landscapes|",
r"C:\Filters\Pics345678|",
r"C:\Filters\Pics2[=11=]000000|",
r"C:\Filters\Pics2[=11=]000000|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, SUFFIX =
FILE PATH = C:\HDPhotos\Landscapes, SUFFIX =
FILE PATH = C:\Filters\Pics2[=12=]000000, SUFFIX = XAV7
strings = [
r"C:\Photos\Selfies|",
r"C:\HDPhotos\Landscapes|",
r"C:\Filters\Pics345678|",
r"C:\Filters\Pics2[=10=]000000|",
r"C:\Filters\Pics2[=10=]000000|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' 作为一个负面的例子。
我的目标是在 file_path
组中捕获实际文件路径,前提是字符串 NOT 在管道之前有一个 8 个字符长度的数字symbol |
并匹配另一组中管道符号之后的任何内容(我在这里没有实现)。
所以在上面的例子中它应该只匹配前两个字符串
C:\Photos\Selfies
C:\HDPhotos\Landscapes
如果是最后一个字符串
C:\Filters\Pics2[=12=]000000|XAV7
我想在 <file_path>
中匹配 C:\Filters\Pics2[=18=]000000
并在另一个名为 .
的组中匹配 XAV7
(如果我在负面展望方面得到一些帮助,我可以自己解决这个问题)
当前
下面粘贴的代码片段输出
FILE PATH = C:\Photos\Selfies|
FILE PATH = C:\HDPhotos\Landscapes|
FILE PATH = C:\Filters\Pics345678|
FILE PATH = C:\Filters\Pics2[=13=]000000|
FILE PATH = C:\Filters\Pics2[=13=]000000|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
有人也可以解释一下吗?
您可以使用
^(?!.*\\d{8}\|$)(?P<file_path>.*)\|(?P<suffix>.*)
参见regex demo。
详情
^
- 字符串的开头(?!.*\\d{8}\|$)
- 如果字符串包含\
后跟八位数字,然后在字符串 末尾包含 (?P<file_path>.*)
- 组“file_path”:除换行字符外的任何零个或多个字符尽可能多\|
- 一根烟斗(?P<suffix>.*)
- “后缀”组:字符串的其余部分,除换行字符外的任何零个或多个字符,尽可能多。
|
,则匹配失败
import re
strings = [
r"C:\Photos\Selfies|",
r"C:\HDPhotos\Landscapes|",
r"C:\Filters\Pics345678|",
r"C:\Filters\Pics2[=11=]000000|",
r"C:\Filters\Pics2[=11=]000000|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, SUFFIX =
FILE PATH = C:\HDPhotos\Landscapes, SUFFIX =
FILE PATH = C:\Filters\Pics2[=12=]000000, SUFFIX = XAV7