这个问题在这里已有答案:
在写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')
格式化的字符串文字或f字符串是以“f”或“F”为前缀的字符串文字。
这些字符串可能包含替换字段,这些字段是由大括号{}分隔的表达式。
虽然其他字符串文字总是具有常量值,但格式化字符串实际上是在运行时计算的表达式。
在这种情况下:
围绕'string.punctuation`` are a replacement field, i.e. the string is to be formatted with
string.punctuation, which, in Python, is a 'string of ASCII characters which are considered punctuation marks in the
C` locale'的大括号。
要了解更多信息,请查看these Python文档和string.punctuation
references :-)
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'.
这里!
引入了转换字段。 !r
称repr()
然后使用
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 docs,string.punctuation
是:
ASCII字符的字符串,在
C
语言环境中被视为标点字符。
如果你真的想深入研究这个问题:什么是C
语言环境?
C标准将语言环境定义为程序范围的属性,可能需要相对昂贵的更改。最重要的是,一些实现被打破,频繁的区域设置更改可能导致核心转储。这使得语言环境在正确使用时有些痛苦。
最初,当程序启动时,无论用户的首选语言环境是什么,语言环境都是
C
语言环境。
这些是修改字符串文字行为的各种标志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
这只是Python的新literal string interpolation (f-strings),可从Python 3.6获得