Инициализировать константы базы данных
blockquote>Создать постоянное имя базы данных, имя пользователя, пароль, URL и драйверы, лимит опроса и т. д.
// init database constants private static final String DATABASE_DRIVER = "com.mysql.jdbc.Driver"; private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/database_name"; private static final String USERNAME = "root"; private static final String PASSWORD = ""; private static final String MAX_POOL = "250"; // set your own limit
Инициализировать Соединение и свойства
blockquote>Как только соединение установлено, его лучше сохранить для целей повторного использования.
// init connection object private Connection connection; // init properties object private Properties properties;
Создать свойства
blockquote>Объект свойства содержит информацию о соединении, проверьте, уже ли он установлен.
// create properties private Properties getProperties() { if (properties == null) { properties = new Properties(); properties.setProperty("user", USERNAME); properties.setProperty("password", PASSWORD); properties.setProperty("MaxPooledStatements", MAX_POOL); } return properties; }
Подключить базу данных
blockquote>Теперь подключиться к базы данных с использованием констант и свойств, инициализированных.
// connect database public Connection connect() { if (connection == null) { try { Class.forName(DATABASE_DRIVER); connection = DriverManager.getConnection(DATABASE_URL, getProperties()); } catch (ClassNotFoundException | SQLException e) { // Java 7+ e.printStackTrace(); } } return connection; }
Отключить базу данных
blockquote>Как только вы закончите работу с базой данных, просто закройте соединение.
// disconnect database public void disconnect() { if (connection != null) { try { connection.close(); connection = null; } catch (SQLException e) { e.printStackTrace(); } } }
Все вместе
blockquote>Используйте этот класс
MysqlConnect
непосредственно после изменения имени_базы, имени пользователя и пароля и т. д.import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; public class MysqlConnect { // init database constants private static final String DATABASE_DRIVER = "com.mysql.jdbc.Driver"; private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/database_name"; private static final String USERNAME = "root"; private static final String PASSWORD = ""; private static final String MAX_POOL = "250"; // init connection object private Connection connection; // init properties object private Properties properties; // create properties private Properties getProperties() { if (properties == null) { properties = new Properties(); properties.setProperty("user", USERNAME); properties.setProperty("password", PASSWORD); properties.setProperty("MaxPooledStatements", MAX_POOL); } return properties; } // connect database public Connection connect() { if (connection == null) { try { Class.forName(DATABASE_DRIVER); connection = DriverManager.getConnection(DATABASE_URL, getProperties()); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } return connection; } // disconnect database public void disconnect() { if (connection != null) { try { connection.close(); connection = null; } catch (SQLException e) { e.printStackTrace(); } } } }
Как использовать?
blockquote>Инициализировать класс базы данных.
// !_ note _! this is just init // it will not create a connection MysqlConnect mysqlConnect = new MysqlConnect();
Где-то еще в вашем коде ...
String sql = "SELECT * FROM `stackoverflow`"; try { PreparedStatement statement = mysqlConnect.connect().prepareStatement(sql); ... go on ... ... go on ... ... DONE .... } catch (SQLException e) { e.printStackTrace(); } finally { mysqlConnect.disconnect(); }
Это все :) Если что-нибудь улучшить, отредактируйте его! Надеюсь, это полезно.
s = r'abc123d, hello 3.1415926, this is my book'
print re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s)
Вам не нужно escape
дважды, когда вы используете raw mode
.
Выход: ['123', '3.1415926']
Также тип возврата будет списком strings
.Если вы хотите, чтобы возвращаемый тип, как integers
и floats
, использовал map
import re,ast
s = r'abc123d, hello 3.1415926, this is my book'
print map(ast.literal_eval,re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s))
Выход: [123, 3.1415926]
Здесь есть две вещи:
re.findall
возвращает захваченные тексты, если шаблон регулярного выражения содержит в нем группы захвата r'\\.'
в вашем шаблон соответствует двум последовательным символам, \
и любому символу, отличному от новой строки. См. ссылку findall
:
Если одна или несколько групп присутствуют в шаблоне, верните список групп; это будет список кортежей, если шаблон имеет более одной группы. Пустые совпадения включаются в результат, если они не касаются начала другого совпадения.
blockquote>Обратите внимание, что чтобы
re.findall
возвращали только совпадающие значения, вы обычно можете
- удаляет избыточные группы захвата (например,
(a(b)c)
->abc
)- преобразует все группы захвата в , не захватывая (то есть замените
(
на(?:
) , если отсутствуют обратные ссылки, которые относятся к значениям группы в шаблоне (см. ниже)- вместо
re.finditer
использовать[x.group() for x in re.finditer(pattern, s)]
)В вашем случае
findall
вернул все захваченные тексты, которые были пустыми, потому что вы\\
в [литерале] строкиr''
, которые пытались сопоставить литерал\
.Чтобы соответствовать номерам, вам нужно использовать
-?\d*\.?\d+
Регулярное выражение соответствует:
-?
- Дополнительный знак минус\d*
- Необязательные цифры\.?
- Дополнительный десятичный разделитель\d+
- 1 или более цифр.См. demo
Вот демон IDEONE :
import re s = r'abc123d, hello 3.1415926, this is my book' pattern = r'-?\d*\.?\d+' L = re.findall(pattern, s) print(L)