У меня есть фрагмент ниже, где я ищу слово koint, но он печатает на нем все связанные слова, такие как koint
, koint_local
и koint_limited
.
Существует строгий способ поиска строк/слов в этом типе требований, кроме регулярного выражения.
from subprocess import Popen, PIPE
CRED = '\033[91m'
CGRN = '\033[92m'
CEND = '\033[0m'
with open("kkdiff", "r") as lid:
for line in lid:
line = line.strip()
proc = Popen(['id', line], stdout=PIPE,)
myID = proc.communicate()[0].decode('utf-8')
if 'koint' in myID:
print(line, CGRN + "Success: " + CEND + "User exists in the Group")
else:
print(line, CRED + "Failed: " + CEND + "User does not exists in the Group")
Вышеприведенный фрагмент возвращается ниже, пока я ищу только koint
:
user1 Failed: User does not exists in the Group
user30 Success: User exists in the Group (<-- koint_local)
user81 Success: User exists in the Group (<-- koint_limited)
Исходные данные в myID:
uid=24699(user1) gid=1001(skilla) groups=1786(koint),1614(koint_limited),101(torr)
В приведенных выше данных, даже если koint
missing и koint_limited
, там говорится "Успех".
Requited: Print Success, если он находит koint
in line.
Просто уточнить, как я упоминаю в начале моего сообщения отдельно от регулярного выражения: Хотя регулярное выражение работает:
from subprocess import Popen, PIPE
CRED = '\033[91m'
CGRN = '\033[92m'
CEND = '\033[0m'
with open("kkdiff", "r") as lid:
for line in lid:
line = line.strip()
proc = Popen(['id', line], stdout=PIPE,)
myID = proc.communicate()[0].decode('utf-8')
if re.search(r'\bkoint\b', myID):
print(line, CGRN + "Success: " + CEND + "User exists in the Group")
else:
print(line, CRED + "Failed: " + CEND + "User does not exists in the Group")
Regex, который соответствует строке с полным словом koint
>>> re.search(r'\bkoint\b', 'groups=1786(koint)') is not None
True
>>> re.search(r'\bkoint\b', '1614(koint_limited)') is not None
False
Синтаксис регулярного выражения
Похоже, что команда groups
будет лучше соответствовать вашим потребностям.
>>> proc = subprocess.Popen(['groups', line], stdout=PIPE)
>>> myID = proc.communicate()[0].decode('utf-8')
>>> 'koint' in myID.split()
if re.search(r'\koint\b', myID):
со словами границы, но мой вопрос остается тем же, кроме регулярного выражения.
in
операторе , если вы использовали groups
вместо id
.
Я скомпилировал рабочие коды, так что это может быть полезно для тех, кто ищет SO.Now есть два решения с regex
и без него.
1) Решение без regex
from subprocess import Popen, PIPE, DEVNULL
##### color for success & Failed code ########
CRED = '\033[91m'
CGRN = '\033[92m'
CEND = '\033[0m'
###############################################
with open(input("Please Enter the userfile: "), "r") as lid:
for line in lid:
line = line.strip()
proc = Popen(['groups', line], stdout=PIPE, stderr=DEVNULL)
myID = proc.communicate()[0].decode('utf-8')
if 'koint' in myID.split():
print(line, CGRN + "Success: " + CEND + "user exists in the group")
else:
print(line, CRED + "Failed: " + CEND + "user doesn't exists in the group")
2) Решение, основанное на regex
from subprocess import Popen, PIPE, DEVNULL
import re
##### color for success & Failed code ########
CRED = '\033[91m'
CGRN = '\033[92m'
CEND = '\033[0m'
################################################
with open(input("Please Enter the userfile: "), "r") as lid:
for line in lid:
line = line.strip()
proc = Popen(['id', line], stdout=PIPE, stderr=DEVNULL)
myID = proc.communicate()[0].decode('utf-8')
if re.search(r'\bkoint\b', myID):
print(line, CGRN + "Success: " + CEND + "User exists in the Group")
else:
print(line, CRED + "Failed: " + CEND + "User does not exists in the Group")
koint
но неkoint_local
иkoint_limited
myID == 'koint'
?