我的目标是从hello_kitty.dat
中选择Lorem 'hello_kitty.dat' ipsum.
之类的字符串。
我写过这个片段在某种程度上适用于较小的字符串
(来自teststring
选择一个或多个(+
)单词字符(\w
),然后在点(\.
)之前选择三个单词字符(\w{3}
)使用x
进行 sub 选择。
>>> teststring = "Lorem 'hello_kitty.dat' ipsum."
>>> print(re.sub(r'\w+\.\w{3}', "x", teststring))
"Lorem 'x' ipsum."
但是,即使在\w{3}
之后完全不遵循我的模式,我如何修改代码以选择单引号之间的所有内容?
teststring
可能是
"Lorem 'hello_kitty.cmd?command91' ipsum hello_kitty.cmd?command92"
但在这种情况下我不想选择hello_kitty.cmd?command92
,因为它不在单引号内。
答案 0 :(得分:1)
您可以使用:
import re
teststring = "Lorem 'hello_kitty.cmd?command91' ipsum hello_kitty.cmd?command92"
print(re.sub(r"'\w+\.\w{3}[^']*'", "'x'", teststring))
# => Lorem 'x' ipsum hello_kitty.cmd?command92
请参阅Python demo
现在模式匹配:
'
- 单引号\w+
- 一个或多个单词字符\.
- 一个点\w{3}
- 3个字的字符[^']*
- 一个否定的字符类,匹配除单引号之外的任何0 +字符'
- 单引号。答案 1 :(得分:1)
要把我的两分钱,你可以使用:
'[^']+' # quotes with a negated character class in between
<小时/>
Python
中的内容是:
import re
string = """
"Lorem 'hello_kitty.dat' ipsum."
"Lorem 'hello_kitty.cmd?command91' ipsum hello_kitty.cmd?command92"
"""
rx = re.compile(r"'[^']+'")
string = rx.sub("x", string)
print(string)
# "Lorem x ipsum."
# "Lorem x ipsum hello_kitty.cmd?command92"
答案 2 :(得分:0)
只需使用非贪婪的正则表达式:
import re
teststring = "Lorem 'hello_kitty.cmd?command91' ipsum hello_kitty.cmd?command92"
print(re.sub(r"'.*?'", "'x'", teststring)
返回Lorem 'x' ipsum hello_kitty.cmd?command9
正则表达式'.*?'
匹配单引号之间的所有内容,但采用最短的字符串。