python中的regex.compile()参数中的不同前缀[duplicate]

问题描述 投票:-1回答:4

这个问题在这里已有答案:

在写re.compile时,我多次使用r前缀(re.compile(r'(xyx))。但是,我第一次看到(re.compile(f'(xyx)),我不确定它在做什么。输出对我来说也没有任何意义。有人可以解释一下这个f在这做什么吗?

import re, string
re_tok = re.compile(f'([{string.punctuation}“”¨«»®´·º½¾¿¡§£₤‘’])')
def tokenize(s): 
    return re_tok.sub(r' \1 ', s).split()


>>> tokenize('˚∆˙©∆©˙¬ ldgkl slgh lshsg ieh 954n bvery590oerfdb o3pg')
python regex
4个回答
1
投票

格式化的字符串文字或f字符串是以“f”或“F”为前缀的字符串文字。

这些字符串可能包含替换字段,这些字段是由大括号{}分隔的表达式。

虽然其他字符串文字总是具有常量值,但格式化字符串实际上是在运行时计算的表达式。

在这种情况下:

围绕'string.punctuation`` are a replacement field, i.e. the string is to be formatted withstring.punctuation, which, in Python, is a 'string of ASCII characters which are considered punctuation marks in theC` locale'的大括号。

要了解更多信息,请查看these Python文档和string.punctuation references :-)


1
投票

根据python documentation

2.4.3. Formatted string literals

版本3.6中的新功能。

格式化的字符串文字或f字符串是以'f''F'为前缀的字符串文字。这些字符串可能包含替换字段,这些字段是由花括号{}分隔的表达式。虽然其他字符串文字总是具有常量值,但格式化字符串实际上是在运行时计算的表达式。

文档中有多个示例,因此我将发布一些示例并解释:

name = "Fred"
f"He said his name is{name!r}."
# "He said his name is 'Fred'.

这里!引入了转换字段。 !rrepr()

然后使用format()协议格式化结果。格式说明符传递给表达式或转换结果的__format__()方法。省略格式说明符时传递空字符串。然后将格式化的结果包含在整个字符串的最终值中。

由于它是使用format()协议格式化的,因此以下是其他用例:

width = 10
precision = 4
value = decimal.Decimal("12.34567")
f"result: {value:{width}.{precision}}"
# result:      12.35

甚至日期时间对象:

today = datetime(year=2017, month=1, day=27)
f"{today:%B %d, %Y}"
# January 27, 2017

根据上述信息,我们将其应用于您的代码:

f'([{string.punctuation}“”¨«»®´·º½¾¿¡§£₤‘’])'

上面的行是将string.punctuation插入该位置的字符串中。

According to the docsstring.punctuation是:

ASCII字符的字符串,在C语言环境中被视为标点字符。

如果你真的想深入研究这个问题:什么是C语言环境?

C标准将语言环境定义为程序范围的属性,可能需要相对昂贵的更改。最重要的是,一些实现被打破,频繁的区域设置更改可能导致核心转储。这使得语言环境在正确使用时有些痛苦。

最初,当程序启动时,无论用户的首选语言环境是什么,语言环境都是C语言环境。


1
投票

这些是修改字符串文字行为的各种标志r表示原始字符串,f表示字符串插值

参见PEP的解释:

F字符串提供了一种使用最小语法在字符串文字中嵌入表达式的方法。应该注意的是,f-string实际上是在运行时计算的表达式,而不是常量值。在Python源代码中,f-string是一个文字字符串,前缀为'f',其中包含大括号内的表达式。表达式将替换为其值。一些例子是:

>>> import datetime
>>> name = 'Fred'
>>> age = 50
>>> anniversary = datetime.date(1991, 10, 12)
>>> f'My name is {name}, my age next year is {age+1}, my anniversary is {anniversary:%A, %B %d, %Y}.'
'My name is Fred, my age next year is 51, my anniversary is Saturday, October 12, 1991.'
>>> f'He said his name is {name!r}.'
"He said his name is 'Fred'."

https://www.python.org/dev/peps/pep-0498/

和python文档:

关于r

字符串和字节文字都可以选择以字母“r”或“R”为前缀;这样的字符串称为原始字符串,并将反斜杠视为文字字符。因此,在字符串文字中,未对特殊处理原始字符串中的'\ U'和'\ u'转义。鉴于Python 2.x的原始unicode文字行为与Python 3.x不同,因此不支持'ur'语法。

https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals

关于f

格式化的字符串文字或f字符串是以“f”或“F”为前缀的字符串文字。这些字符串可能包含替换字段,这些字段是由大括号{}分隔的表达式。虽然其他字符串文字总是具有常量值,但格式化字符串实际上是在运行时计算的表达式。

https://docs.python.org/3/reference/lexical_analysis.html#f-strings


0
投票

这只是Python的新literal string interpolation (f-strings),可从Python 3.6获得

© www.soinside.com 2019 - 2024. All rights reserved.