在写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
字符串两边的大括号。标点符号, which, in Python, is a 'string of ASCII characters which are considered punctuation marks in the
C' 区域设置'。
要了解更多信息,请查看这些 Python 文档和string.punctuation
参考资料:-)
根据python文档:
2.4.3. 格式化字符串文字
版本 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
插入到该位置的字符串中。
根据文档,string.punctuation
是:
在
C
区域设置中被视为标点字符的 ASCII 字符字符串。
如果您真的想更深入地了解这一点:C
区域设置是什么?
C 标准将区域设置定义为程序范围的属性,更改该属性的成本可能相对较高。最重要的是,某些实现被破坏,频繁的区域设置更改可能会导致核心转储。这使得区域设置难以正确使用。
最初,当程序启动时,无论用户的首选区域设置是什么,区域设置都是
C
区域设置。
这些是修改字符串文本行为的各种标志r
表示原始字符串,f
表示字符串插值
请参阅PEP的解释:
F 字符串提供了一种使用最少语法在字符串文本中嵌入表达式的方法。应该注意的是,f 字符串实际上是在运行时计算的表达式,而不是常量值。在 Python 源代码中,f 字符串是一个文字字符串,前缀为"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/
和蟒蛇文档:
关于r
和字节文本都可以选择以字母"r"或"R"为前缀;此类字符串称为原始字符串,并将反斜杠视为文字字符。因此,在字符串文本中,不会特别处理原始字符串中的"\U"和"\u"转义。鉴于Python 2.x的原始Unicode文字行为与Python 3.x的行为不同,不支持"您的"语法。
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的新文字字符串插值(f 字符串),从 Python 3.6 开始可用
。