Как получить строгое совпадение слов в Python3 при прохождении цикла for

1

У меня есть фрагмент ниже, где я ищу слово 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")
  • 0
    Вы имеете в виду, что хотите сопоставить koint но не koint_local и koint_limited
  • 2
    ... myID == 'koint' ?
Показать ещё 4 комментария
Теги:
python-3.x
subprocess

2 ответа

1
Лучший ответ

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()
  • 0
    @ pacholik, спасибо за ваши входные данные, регулярное выражение работает, я могу это сделать, if re.search(r'\koint\b', myID): со словами границы, но мой вопрос остается тем же, кроме регулярного выражения.
  • 0
    @pygo Я не верю, что есть способ, вы должны использовать какое-то регулярное выражение, чтобы найти границы слова. На стороне записки, можно использовать только in операторе , если вы использовали groups вместо id .
Показать ещё 1 комментарий
0

Я скомпилировал рабочие коды, так что это может быть полезно для тех, кто ищет 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")

Ещё вопросы

Сообщество Overcoder
Наверх
Меню