使用^运算符时,如何使正则表达式模式在行首前考虑逗号?

How to make a regular expression pattern consider a comma before the start of line when using the ^ operator?

提问人:Elektvocal95 提问时间:9/22/2023 更新时间:9/22/2023 访问量:57

问:

import re

#example 1  with a  ,  before capture group
input_text = "Hello how are you?, dfdfdfd fdfdfdf other text. hghhg"

#example 2 without a  , (or \.|,|;|\n) before capture group
input_text = "dfdfdfd fdfdfdf other text. hghhg"

#No matter what position you place ^ within the options, it always considers it first, ignoring the others.
fears_and_panics_match = re.search(
                                    r"(?:\.|,|;|\n|^)\s*(?:(?:for|by)\s*me|)\s*(.+?)\s*(?:other\s*text)\s*(?:\.|,|;|\n)", 
                                    #r"(?:\.|,|;|\n)\s*(?:(?:for|by)\s*me|)\s*(.+?)\s*(?:other\s*text)\s*(?:\.|,|;|\n|$)", 
                                    input_text, flags = re.IGNORECASE)


if fears_and_panics_match: print(fears_and_panics_match.group(1))

为什么我使用这个模式捕获,无论你把 . 我需要您评估找到逗号然后找到行首逗号的可能性r"(?:\.|,|;|\n|^)\s*(?:(?:for|by)\s*me|)\s*(.+?)\s*(?:other\s*text)\s*(?:\.|,|;|\n)"Hello how are you?, dfdfdfd fdfdfdf^,^

每种情况下的正确输出:

#for example 1
"dfdfdfd fdfdfdf"

#for example 2
"dfdfdfd fdfdfdf"
python-3.x 正则表达式 字符串 regex-group

评论

1赞 Barmar 9/22/2023
周围替代方案的顺序并不重要。它匹配输入中首先找到的替代项,只要它允许模式的其余部分匹配即可。|
0赞 Elektvocal95 9/22/2023
@Barmar 您建议我该怎么做才能使正则表达式模式优先于标点符号,并且如果没有找到标点符号,那么在这种情况下,它应该尝试匹配字符串的开头^?

答:

0赞 wickedpanda 9/22/2023 #1

您似乎使用了错误的运算符。 插入符号也意味着“开始”——你从来没有指定这个开头应该是什么,所以我的疯狂猜测是它需要任何字符

不知道这对你有多大帮助 - 我试图让我的正则表达式尽可能愚蠢 - 使我更容易发现问题。

这适用于您提供的字符串

"[a-zA-Z0-9\s\?]*,?\s*(\w\s)*(?=other\stext)"
1赞 Nick 9/22/2023 #2

您可以更改正则表达式,以选择性地匹配某些字符,最多为 、 或 ;然后从那里捕获,直到:.,;other text

^(?:.*?[.,;])?\s*(?:(?:for|by)\s*me\s*)?(\w.*?)(?=\s*other\s*text)

它匹配:

  • ^行首
  • (?:.*?[.,;])?以 或 结尾的可选字符串.,;
  • \s*部分空格
  • (?:(?:for|by)\s*me\s*)?可选短语或for meby me
  • (\w.*?)最少字符数,以单词字符开头
  • (?=\s*other\s*text)Lookahead 断言下一个字符是other text

regex101 上的演示

在 python 中(请注意,通过使用,我们不需要正则表达式中):re.match^

strs = [
  'dfdfdfd fdfdfdf other text. hghhg',
  'Hello how are you?, dfdfdfd fdfdfdf other text.hghhg',
  'for me a word other text',
  'A semicolon first; then some words before other text'
]
regex = r'(?:.*?[.,;])?\s*(?:(?:for|by)\s*me\s*)?(\w.*?)(?=\s*other\s*text)'
for s in strs:
    print(re.match(regex, s).group(1))

输出:

dfdfdfd fdfdfdf
dfdfdfd fdfdfdf
a word
then some words before