提问人:Elektvocal95 提问时间:9/22/2023 更新时间:9/22/2023 访问量:57
使用^运算符时,如何使正则表达式模式在行首前考虑逗号?
How to make a regular expression pattern consider a comma before the start of line when using the ^ operator?
问:
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"
答:
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 me
by 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
评论
|