Опция разделения Python shlex, содержащая регулярное выражение

#python #python-3.x #split #shlex

Вопрос:

Допустим, я хочу дать эту команду ./maryam -e crawl_pages -d domain.tld -r "a href=".*" и разделить ее.

Когда я бегу

 >>>line = './maryam -e crawl_pages -d domain.tld -r "a href=".*"'
>>>shlex.split(line)
 

Я получаю следующую ошибку

 Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.8/shlex.py", line 311, in split
    return list(lex)
  File "/usr/lib/python3.8/shlex.py", line 300, in __next__
    token = self.get_token()
  File "/usr/lib/python3.8/shlex.py", line 109, in get_token
    raw = self.read_token()
  File "/usr/lib/python3.8/shlex.py", line 191, in read_token
    raise ValueError("No closing quotation")
ValueError: No closing quotation
 

В основном я хочу, чтобы у пользователя была опция-r для ввода регулярного выражения.
Результат должен выглядеть так

 ['./maryam', '-e', 'crawl_pages', '-d', 'domain.tld', '-r', 'a href=".*']
 

Ответ №1:

Когда вы назначаете

 # XXX BROKEN
line = './maryam -e crawl_pages -d domain.tld -r "a href=".*"'
 

Python анализирует строку и анализирует любые экранирования обратной косой черты, так что в итоге вы не получите фактической обратной косой черты в значении line . Вы можете предотвратить один уровень синтаксического анализа обратной косой черты, используя вместо этого необработанную строку;

 line = r'./maryam -e crawl_pages -d domain.tld -r "a href=".*"'
 

но если ваше ожидаемое значение действительно должно содержать буквальную обратную косую черту, ваш ввод более фундаментально неверен.

Я предполагаю, что у вас просто неверные ожидания, но если это действительно то, чего вы хотите, попробуйте

 # XXX DUBIOUS
line = r'./maryam -e crawl_pages -d domain.tld -r "a href=\".*"'
 

что тогда, однако, выглядит так:

 ['./maryam', '-e', 'crawl_pages', '-d', 'domain.tld', '-r', 'a href=\".*']
 

(потому что Python печатает двойную обратную косую черту, чтобы показать буквальную обратную косую черту).