Python中文
首页
教程
问答
标签
搜索
登录
注册
在字符串开头,正则表达式没有匹配
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>我有一连串的as和bs。我想提取所有重叠的子序列,其中一个子序列是由任意数量的b包围的单个a。这是我写的正则表达式:</p> <pre><code>import re pattern = """(?= # inside lookahead for overlapping results (?:a|^) # match at beginning of str or after a (b* (?:a) b*) # one a between any number of bs (?:a|$)) # at end of str or before next a """ a_between_bs = re.compile(pattern, re.VERBOSE) </code></pre> <p>它似乎按预期工作,除非字符串中的第一个字符是a,在这种情况下,会丢失以下子序列:</p> <pre><code>a_between_bs.findall("bbabbba") # ['bbabbb', 'bbba'] a_between_bs.findall("abbabb") # ['bbabb'] </code></pre> <p>我不明白发生了什么事。如果我改变潜在匹配的开始顺序,结果也会改变:</p> <pre><code>pattern = """(?= (?:^|a) # a and ^ swapped (b* (?:a) b*) (?:a|$)) """ a_between_bs = re.compile(pattern, re.VERBOSE) a_between_bs.findall("abbabb") # ['abb'] </code></pre> <p>我本以为这是对称的,所以以a结尾的字符串也可能会丢失,但事实似乎并非如此。怎么回事?你知道吗</p> <p>编辑:</p> <p>我假设上述玩具示例的解决方案将转化为我的全部问题,但事实似乎并非如此,因此我现在正在详细说明(对此表示抱歉)。我试图从转录的单词中提取“音节”。“音节”是元音<strong>或双元音<strong>,前面和后面有任意数量的辅音。这是我提取它们的正则表达式:</p> <pre><code>vowels = 'æɑəɛiɪɔuʊʌ' diphtongues = "|".join(('aj', 'aw', 'ej', 'oj', 'ow')) consonants = 'θwlmvhpɡŋszbkʃɹdnʒjtðf' pattern = f"""(?= (?:[{vowels}]|^|{diphtongues}) ([{consonants}]* (?:[{vowels}]|{diphtongues}) [{consonants}]*) (?:[{vowels}]|$|{diphtongues}) ) """ syllables = re.compile(pattern, re.VERBOSE) </code></pre> <p>有点棘手的是,双音节以辅音(j或w)结尾,我不想在下一个音节中包含这些辅音。因此,用双负<code>(?<![{consonants}])</code>替换第一个非捕获组是行不通的。我试着用一个正向的lookahead <code>(?<=[{vowels}]|^|{diphtongues})</code>来替换这个组,但是regex不会接受不同的长度(即使删除diphlugues也不起作用,显然<code>^</code>的长度不同)。你知道吗</p> <p>这就是上述模式的问题所在:</p> <pre><code>syllables.findall('æbə') # ['bə'] # should be: ['æb', 'bə'] </code></pre> <p><strong>编辑2:</strong> 我已经改用regex,它允许可变宽度lookbehinds,这就解决了这个问题。令我惊讶的是,它甚至比标准库中的re模块还要快。不过,我还是想知道如何让这个模块和re模块一起工作。(:</p>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>记住python“短路”,所以,如果它匹配“^”,就不会继续查看它是否也匹配“a”。这将“消耗”匹配字符,因此在匹配“a”的情况下,“a”将被消耗并且不可用于下一个要匹配的组,并且因为使用(?)?:)语法是非捕获的,即“a”是“丢失的”,并且不能被下一个分组捕获(b*(?:a)b*),而当第一个分组使用“^”时,第一个“a”将在第二个分组中匹配。你知道吗</p>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
合并Pandas字典DataFram
8 回答
合并pandas数据帧,使用列操作
9 回答
合并pandas数据帧,其中一个值位于另两个值之间
7 回答
合并pandas数据帧:在中创建的空列
8 回答
合并pandas数据帧:如何找出导致
1 回答
合并Pandas数据帧:选择较小的绝对值
10 回答
合并Pandas数据帧(左连接样式)会产生奇怪的结果
2 回答
合并Pandas数据帧中两列的值,应用函数进行重复数据消除和合并
8 回答
合并pandas数据帧中的2列,用前面的值填充nan
3 回答
合并Pandas数据帧会复制一些数据
7 回答
合并pandas数据帧列表
5 回答
合并pandas数据帧占用了太多内存
9 回答
合并pandas数据帧时如何保留列多索引值
7 回答
合并Pandas数据帧的所有列
7 回答
合并pandas数据帧而不更改原始列名
3 回答
合并Pandas数据框,如果字符串df2.domain出现在df.u中
8 回答
合并pandas数据框,无需按特定顺序排列
2 回答
合并pandas数据框中可变数量的行
4 回答
合并Pandas数据框作为分组后的结果
7 回答
合并Pandas时匹配子字符串
8 回答