regex 创建Python正则表达式来匹配字符串

s4n0splo  于 6个月前  发布在  Python
关注(0)|答案(2)|浏览(72)

我很难为这个字符串创建一个正则表达式。我需要:
1.提取Property后面的单词,直到&
1.提取类别后的单词,直到&
1.创建一个正则表达式来匹配从“cat”到“modifiedBy”之前的所有内容

"cat":"Property : TikTok Videos & Category : Insta Videos & User Impact: TBD & User Minutes :
18","modifiedBy"

字符串
我现在的regex是:

"cat":"Property : (?P<property>\w+.*?) & Category : (?P<category>\w+)?


1.这可以将“属性”正确命名为“TikTok视频”。
1.但是命名为“Category”的正则表达式只显示单词“Insta”。如果我在(?P\w+中添加一个+,那么它最终会一直消耗到字符串的结尾。
1.至于从“cat”到“modified”之前的最后一个逗号的整个字符串,我不知道如何捕获它。
所以最终的结果是:

  1. property = TIkTok视频
    1.类别= Insta视频
  2. Entire_string =“cat”:“属性:TikTok视频&类别:Insta视频&用户影响:待定&用户分钟数:18”
vs3odd8k

vs3odd8k1#

“.

(?:Property|Category)\W+(.+?) *&

字符串
或者更准确地说。

(?:Property|Category) *: *(.+?) *&


创建一个正则表达式来匹配从“cat”到“modifiedBy”之前的所有内容.
.至于消耗从“cat”到“modified”之前的最后一个逗号的整个字符串,我不知道如何捕获它。
要 * 匹配 * 值,请使用 *look-around**语法 *。

(?s)\"cat\":.+?(?=,\"modifiedBy\")


并且,要 * 捕获 * 值,只需提供文本。

(?s)(\"cat\" *: *.+?),\"modifiedBy\"


这里有一个例子。

s = '"cat":"Property : TikTok Videos & Category : Insta Videos & User Impact: TBD & User Minutes :\n' \
    '18","modifiedBy"'
for m in re.finditer('(?:Property|Category) *: *(.+?) *&', s):
    print(f"'{m.group(1)}'")
for m in re.finditer(r'(?s)\"cat\":.+?(?=,\"modifiedBy\")', s):
    print(f"'{m.group()}'")


输出

'TikTok Videos'
'Insta Videos'
'"cat":"Property : TikTok Videos & Category : Insta Videos & User Impact: TBD & User Minutes :
18"'

iugsix8n

iugsix8n2#

您可以使用一个正则表达式使用前瞻Assert来完成所有这些。

r'(?s)^(?=.*?Property\s*:\s*(?P<Property>[^&]*?)\s*&)(?=.*?Category\s*:\s*(?P<Catggory>[^&]*?)\s*&)(?=.*?(?P<cat>"cat".*?"),\s*"modifiedBy")'

字符串
https://regex101.com/r/gdM2q1/1
扩展/格式化

(?s)
^
(?=
   .*? Property \s* : \s* 
   (?P<Property> [^&]*? )        # (1)
   \s* &
)
(?=
   .*? Category \s* : \s* 
   (?P<Catggory> [^&]*? )        # (2)
   \s* &
)
(?=
   .*? 
   (?P<cat> "cat" .*? " )        # (3)
   , \s* "modifiedBy"
)


如果你需要使用"cat"文本,使用这个。
这样做是为了将当前位置移动到最后一组类别和属性文本之后,
(虽然不能保证)。你还需要添加m多行修饰符(?sm)

r'(?sm)^(?=.*?Property\s*:\s*(?P<Property>[^&]*?)\s*&)(?=.*?Category\s*:\s*(?P<Catggory>[^&]*?)\s*&).*?(?P<cat>"cat".*?"),\s*"modifiedBy"'


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

相关问题