原谅这个简单化的问题,但我已经阅读了SO问题和Python文档,仍然无法解决这个问题。
如何创建Python正则表达式来测试字符串是否包含ANY,但只包含A,U,G和C字符?字符串可以包含其中一个或所有字符,但如果它包含任何其他字符,我希望正则表达式失败。
我试过了:
>>> re.match(r"[AUGC]", "AUGGAC")
<_sre.SRE_Match object at 0x104ca1850>
但是在字符串末尾添加一个X仍然有效,这不是我的预期:
>>> re.match(r"[AUGC]", "AUGGACX")
<_sre.SRE_Match object at 0x104ca1850>
提前致谢。
答案 0 :(得分:5)
您需要使用正则表达式来使用整个字符串(如果不能,则会失败)。 re.match
隐含地在字符串的开头添加一个锚点,你需要在结尾添加一个:
re.match(r"[AUGC]+$", string_to_check)
另请注意+
,它会重复匹配您的字符集(因为,重点是消耗整个字符串)
答案 1 :(得分:2)
使用^[AUCG]*$
;这将匹配整个字符串。
或者,如果必须至少有一个字母,^[AUCG]+$
- ^
和$
代表字符串的开头和结束字符串; *
和+
分别代表零或更多和一个或多个。
这纯粹是关于正则表达式而不是特定于Python的。
答案 2 :(得分:2)
如果值是字符串中的唯一字符,则可以执行以下操作:
>>> r = re.compile(r'^[AUGC]+$')
>>> r.match("AUGGAC")
<_sre.SRE_Match object at 0x10ee166b0>
>>> r.match("AUGGACX")
>>>
然后如果你想让正则表达式匹配空字符串,你可以这样做:
>>> r = re.compile(r'^[AUGC]*$')
>>> r.match("")
<_sre.SRE_Match object at 0x10ee16718>
>>> r.match("AUGGAC")
<_sre.SRE_Match object at 0x10ee166b0>
>>> r.match("AUGGACX")
这里描述了第一个正则表达式的作用:
答案 3 :(得分:1)
你真的很亲密。您刚刚测试的是A或U或G或C的单个字符。
你想要的是匹配一个或多个字母都是A或U或G或C的字符串,你可以通过在正则表达式中添加加号修饰符来实现这一点。
re.match(r"^[AUGC]+$", "AUGGAC")
此外,在末尾添加$
标记字符串的结尾,您可以选择使用前面的^
来匹配字符串的开头。
答案 4 :(得分:1)
只是检查一下除了&#34; AUGC&#34;在那里:
if re.search('[^AUGC]', string_to_check):
#fail
您可以添加检查以确保字符串在同一语句中不为空:
if not string_to_check or re.search('[^AUGC]', string_to_check):
#fail
答案 5 :(得分:1)
不需要使用正则表达式:
>>> good = 'AUGGCUA'
>>> bad = 'AUGHACUA'
>>> all([c in 'AUGC' for c in good])
True
>>> all([c in 'AUGC' for c in bad])
False
答案 6 :(得分:1)
我知道你正在询问正则表达式,但我还是值得一提set
。要确定您的字符串是否仅包含A U G或C,您可以这样做:
>>> input = "AUCGCUAGCGAU"
>>> s = set("AUGC")
>>> set(input) <= s
True
>>> bad = "ASNMSA"
>>> set(bad) <= s
False
修改:感谢@roippi发现我的错误,应该使用<=
,而不是==
。
不使用<=
,而是可以使用方法issubset
:
>>> set("AUGAUG").issubset(s)
True
如果字符串input
中的所有字符都在集s
中,则issubset
将返回True
。
答案 7 :(得分:0)
来自:https://docs.python.org/2/library/re.html
可以通过补充集来匹配不在范围内的字符。 如果集合的第一个字符是“^”,则将匹配集合中不包含的所有字符。 例如,[^ 5]将匹配除“5”之外的任何字符,[^^]将匹配除“^”之外的任何字符。 如果它不是集合中的第一个字符,则没有特殊含义。
所以你可以做[^ AUGC]并且如果它匹配那么拒绝它,否则保留它。