我希望正则表达式搜索在到达“。”时结束,但不希望在到达“。”时结束。我知道使用[^...]
来排除单个字符,并且一直使用它来停止搜索到某个字符。不过,这不适用于字符串,因为[^. ]
到达任一字符时都会停止。说我有代码
import re
def main():
my_string = "The value of the float is 2.5. The int's value is 2.\n"
re.search("[^.]*", my_string)
main()
哪个匹配对象带有字符串
"The value of the float is 2"
如何更改此设置,使其仅在字符串“。”之后停止?
奖金问题,有没有办法告诉正则表达式在到达多个字符串之一时就停止?以上面的代码为例,如果我希望搜索在找到字符串“。”或字符串“。\ n”时结束,我将如何处理?谢谢!
答案 0 :(得分:2)
要从字符串的开头到.
后跟空格匹配,请使用
^(.*?)\.\s
如果您只想在点后添加空格或换行符,请使用以下两种方法之一(如果只有一个字符,则最好使用第二个字符;如果有多个字符,请使用替代字符)
^(.*?)\.(?: |\n)
^(.*?)\.[ \n]
请参见regex demo。
详细信息
^
-字符串的开头(.*?)
-捕获组1:除换行符以外的任何0+个字符,并且尽可能少\.
-文字.
字符\s
-空格字符(?: |\n)
/ [ \n]
-与空格或(|
)换行符匹配的非捕获组。import re
my_string = "The value of the float is 2.5. The int's value is 2.\n"
m = re.search("^(.*?)\.\s", my_string) # Try to find a match
if m: # If there is a match
print(m.group(1)) # Show Group 1 value
注意:如果输入中可能存在换行符,请传递re.S
或re.DOTALL
标志:
m = re.search("^(.*?)\.\s", my_string, re.DOTALL)
答案 1 :(得分:0)
除了Wiktor解释的经典方法外,在这种情况下,拆分也是一种有趣的解决方案。
>>> my_string
"The value of the float is 2.5. The int's value is 2.\n"
>>> re.split('\. |\.\n', my_string)
['The value of the float is 2.5', "The int's value is 2", '']
如果您想在句子的末尾加上句号,可以执行以下操作:
['{}.'.format(sentence) for sentence in re.split('\. |\.\n', my_string) if sentence]
要处理句子之间的多个空格:
>>> str2 = "The value of the float is 2.5. The int's value is 2.\n\n "
>>> ['{}.'.format(sentence)
for sentence in re.split('\. \s*|\.\n\s*', str2)
if sentence
]
['The value of the float is 2.5.', "The int's value is 2."]