在Python中用正则表达式识别和捕获文本时遇到问题

2024-06-16 16:06:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我在stackoverflow和google上搜索过,但找不到我要找的具体答案。对于regex,我是这样假设的,因为它是非常具体的,我不确定它是什么,我正在变得不正确

我试图在一个长文本字符串中捕获7组字符串。我可以捕获6,但是我不能调整正则表达式到足以捕获第7个字符串

我试图在下面的文本中捕获的7个组:特权、货币、活动、选项卡、pore、url、locale

     text = 'gon.urls={stringstuffhere};gon.pageview={morstrings};gon.pore{stringstuffhere};
gon.capture={allyourstrings};
    gon.perks={stringshere};gon.base={stringsbelongtous};gon.campaign={evenmorestrings};gon.haha={somanystrings};
        gon.tabs=[{morestrings}{morestrings}{more strings}];
            gon.main={mainstringsturnon};gon.currency={strings};
    gon.locale="en";gon.default_later="somestrings"'

关于正在搜索的字符串的一些注释

  • 我要搜索的每个部分都以“gon.title开头”
  • 以上文本的所有格式在“gon.title”、“=”和方括号/花括号(或非方括号)方面都是准确的。实际文本的唯一区别是这些括号/括号内的文本
  • 我捕获的文本大小不一,包括各种文本,包括字母数字、空格和非空格字符
  • 我正在搜索的大多数部分夹在我没有捕获的其他“gon”字符串之间,但“locale”组直接位于另一个捕获的组之后。
  • 我正在搜索的一个字符串(gon.tabs)以括号“[”开头,其他字符串(除了locale)以{
  • 每个字符串的每个“gon”部分后面都有一个分号,从下一个“gon”组开始
  • 以上文本的所有格式在“gon.title”、“=”和方括号/花括号(或非方括号)方面都是准确的。实际文本的唯一区别是这些括号/括号内的文本
  • “gon.locale”是丢失的部分

到目前为止,我的方法是找到包含“gon.title”、“=”符号和可能的“[”或“{”的部分,然后捕获我想要的文本,并可能以“}”或“]”结尾,后跟“;”

这是我当前用于捕获数据的模式:

result= re.findall('gon.(perks|currency|campaign|tabs|pore|urls|locale)=\[?\{?(.*?)\"?\}?\]?;', text)

这将捕获所有7个字符串,但由于要捕获的文本中有分号,因此不会捕获其中一个字符串的所有字符串(文本可以有未知数量的分号)

输出如下:

[('urls',
  'stringstuffhere'),
 ('pore',
  'stringstu')...]  #rest of the groups are captured correctly, but off from a semi colon in the string

我试着调整模式:

result= re.findall('gon.(perks|currency_exchange|campaign|tabs|trust_passport|urls|locale)=\[?\{?(.*?)\"?\}?\]?;gon', text)

添加下一个文本“组”的“gon”。这有助于捕获我丢失的所有部分,但是,它不查找/捕获“gon.locale”字符串

输出如下:

[('urls',
      'stringstuffhere'),
     ('pore',
      'stringstuffhere'),
('tabs',
      '{morestrings}{morestrings}{more strings}'),
('campaign',
      'evenmorestrings'),
('perks',
      'stringshere'),
('currency',
      'strings'),
('pore',
      'stringstuffhere')]  #locale group  missing

我尝试了各种不同的选项和微调,包括使用原始字符串。但要么我漏掉了其中一个字符串组中的一些数据并捕获了第7个字符串,要么,我漏掉了其中一个字符串组,但捕获了我找到的所有字符串组中的数据

所需的结果与上面的最新示例类似,但缺少“locale”组。我不知道为什么在图案的末尾加个“g”或“gon”会使那部分脱落

任何帮助都将不胜感激! 如果我能澄清以上的解释,请告诉我

****进行了编辑。当使用https://regex101.com/工具构建时。我看到最后一个“locale”组紧跟在我捕获的另一个组之后。因此,在搜索字符串时,将“g”添加到模式的末尾有助于捕获我丢失的所有字符串,但“pointer”不会在下一组中再次包含该“g”,而是从下一个字母“o”开始

我找到了两个可行的方法,为locale组添加另一个以“on”开头的模式,或者使用一个与下一个“gon”字符串匹配的正向前瞻,而不使其成为匹配的一部分。下面是两种模式

r'(?<=gon\.)(perks|currency|campaign|tabs|pore|urls|locale)\[?{?\"?(.+?)\"?}?\]?;(?=g)|on\.(locale)=(\"\w+\");', html)

r'gon.(perks|currency|campaign|tabs|pore|urls|locale)=\[?\{?(.*?\"?)\}?\]?;(?=gon)'

Tags: 字符串文本模式urlslocalecurrency括号strings
1条回答
网友
1楼 · 发布于 2024-06-16 16:06:34

也许吧

gon\.(perks|currency|campaign|tabs|trust_passport|urls|locale)=\[?{?"?(.*?)"?}?\]?;|gon\.pore{([^}]+)}

或者

gon\.(perks|currency|campaign|tabs|trust_passport|urls|locale|pore)=?\[?{?"?(.*?)"?}?\]?;

在这里工作还可以

Demo

测试1

import re

string = '''
gon.urls={stringstuffhere};gon.pageview={morstrings};gon.pore{stringstuffhere};
gon.capture={allyourstrings};
    gon.perks={stringshere};gon.base={stringsbelongtous};gon.campaign={evenmorestrings};gon.haha={somanystrings};
        gon.tabs=[{morestrings}{morestrings}{more strings}];
            gon.main={mainstringsturnon};gon.currency={strings};gon.bub={someonesetusup};
    gon.locale="en";gon.default_later="somestrings
'''

expression = r'(?m)gon\.(perks|currency|campaign|tabs|trust_passport|urls|locale)=\[?{?"?(.*?)"?}?\]?;|gon\.pore{([^}]+)}'


print(re.findall(expression, string))

输出1

[('urls', 'stringstuffhere', ''), ('', '', 'stringstuffhere'), ('perks', 'stringshere', ''), ('campaign', 'evenmorestrings', ''), ('tabs', 'morestrings}{morestrings}{more strings', ''), ('currency', 'strings', ''), ('locale', 'en', '')]

测试2

import re

string = '''
gon.urls={stringstuffhere};gon.pageview={morstrings};gon.pore{stringstuffhere};
gon.capture={allyourstrings};
    gon.perks={stringshere};gon.base={stringsbelongtous};gon.campaign={evenmorestrings};gon.haha={somanystrings};
        gon.tabs=[{morestrings}{morestrings}{more strings}];
            gon.main={mainstringsturnon};gon.currency={strings};gon.bub={someonesetusup};
    gon.locale="en";gon.default_later="somestrings
'''

expression = r'(?m)gon\.(perks|currency|campaign|tabs|trust_passport|urls|locale|pore)=?\[?{?"?(.*?)"?}?\]?;'


print(re.findall(expression, string))

输出2

[('urls', 'stringstuffhere'), ('pore', 'stringstuffhere'), ('perks', 'stringshere'), ('campaign', 'evenmorestrings'), ('tabs', 'morestrings}{morestrings}{more strings'), ('currency', 'strings'), ('locale', 'en')]


如果您希望简化/修改/探索表达式,在regex101.com的右上面板中已经解释过了。如果您愿意,还可以在this link中查看它如何与一些示例输入匹配


正则表达式电路

jex.im可视化正则表达式:

enter image description here

相关问题 更多 >