@@ -74,10 +74,11 @@ def maybe(*choices): return group(*choices) + '?'
74
74
Single3 = r"[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*'''"
75
75
# Tail end of """ string.
76
76
Double3 = r'[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""'
77
- Triple = group ("[ubUB]?[rR]?'''" , '[ubUB]?[rR]?"""' )
77
+ _litprefix = r"(?:[uUrRbB]|[rR][bB]|[bBuU][rR])?"
78
+ Triple = group (_litprefix + "'''" , _litprefix + '"""' )
78
79
# Single-line ' or " string.
79
- String = group (r"[uU]?[rR]? '[^\n'\\]*(?:\\.[^\n'\\]*)*'" ,
80
- r'[uU]?[rR]? "[^\n"\\]*(?:\\.[^\n"\\]*)*"' )
80
+ String = group (_litprefix + r" '[^\n'\\]*(?:\\.[^\n'\\]*)*'" ,
81
+ _litprefix + r' "[^\n"\\]*(?:\\.[^\n"\\]*)*"' )
81
82
82
83
# Because of leftmost-then-longest match semantics, be sure to put the
83
84
# longest operators first (e.g., if = came before ==, == would get
@@ -95,9 +96,9 @@ def maybe(*choices): return group(*choices) + '?'
95
96
Token = Ignore + PlainToken
96
97
97
98
# First (or only) line of ' or " string.
98
- ContStr = group (r"[uUbB]?[rR]? '[^\n'\\]*(?:\\.[^\n'\\]*)*" +
99
+ ContStr = group (_litprefix + r" '[^\n'\\]*(?:\\.[^\n'\\]*)*" +
99
100
group ("'" , r'\\\r?\n' ),
100
- r'[uUbB]?[rR]? "[^\n"\\]*(?:\\.[^\n"\\]*)*' +
101
+ _litprefix + r' "[^\n"\\]*(?:\\.[^\n"\\]*)*' +
101
102
group ('"' , r'\\\r?\n' ))
102
103
PseudoExtras = group (r'\\\r?\n' , Comment , Triple )
103
104
PseudoToken = Whitespace + group (PseudoExtras , Number , Funny , ContStr , Name )
@@ -111,6 +112,7 @@ def maybe(*choices): return group(*choices) + '?'
111
112
"b'''" : single3prog , 'b"""' : double3prog ,
112
113
"ur'''" : single3prog , 'ur"""' : double3prog ,
113
114
"br'''" : single3prog , 'br"""' : double3prog ,
115
+ "rb'''" : single3prog , 'rb"""' : double3prog ,
114
116
"R'''" : single3prog , 'R"""' : double3prog ,
115
117
"U'''" : single3prog , 'U"""' : double3prog ,
116
118
"B'''" : single3prog , 'B"""' : double3prog ,
@@ -120,6 +122,9 @@ def maybe(*choices): return group(*choices) + '?'
120
122
"bR'''" : single3prog , 'bR"""' : double3prog ,
121
123
"Br'''" : single3prog , 'Br"""' : double3prog ,
122
124
"BR'''" : single3prog , 'BR"""' : double3prog ,
125
+ "rB'''" : single3prog , 'rB"""' : double3prog ,
126
+ "Rb'''" : single3prog , 'Rb"""' : double3prog ,
127
+ "RB'''" : single3prog , 'RB"""' : double3prog ,
123
128
'r' : None , 'R' : None ,
124
129
'u' : None , 'U' : None ,
125
130
'b' : None , 'B' : None }
@@ -132,7 +137,9 @@ def maybe(*choices): return group(*choices) + '?'
132
137
"ur'''" , 'ur"""' , "Ur'''" , 'Ur"""' ,
133
138
"uR'''" , 'uR"""' , "UR'''" , 'UR"""' ,
134
139
"br'''" , 'br"""' , "Br'''" , 'Br"""' ,
135
- "bR'''" , 'bR"""' , "BR'''" , 'BR"""' ,):
140
+ "bR'''" , 'bR"""' , "BR'''" , 'BR"""' ,
141
+ "rb'''" , 'rb"""' , "Rb'''" , 'Rb"""' ,
142
+ "rB'''" , 'rB"""' , "RB'''" , 'RB"""' ,):
136
143
triple_quoted [t ] = t
137
144
single_quoted = {}
138
145
for t in ("'" , '"' ,
@@ -142,7 +149,9 @@ def maybe(*choices): return group(*choices) + '?'
142
149
"ur'" , 'ur"' , "Ur'" , 'Ur"' ,
143
150
"uR'" , 'uR"' , "UR'" , 'UR"' ,
144
151
"br'" , 'br"' , "Br'" , 'Br"' ,
145
- "bR'" , 'bR"' , "BR'" , 'BR"' , ):
152
+ "bR'" , 'bR"' , "BR'" , 'BR"' ,
153
+ "rb'" , 'rb"' , "Rb'" , 'Rb"' ,
154
+ "rB'" , 'rB"' , "RB'" , 'RB"' ,):
146
155
single_quoted [t ] = t
147
156
148
157
tabsize = 8
0 commit comments